mirror of
https://github.com/UzixLS/KernelEx.git
synced 2025-07-19 07:21:20 +03:00
import KernelEx-4.0-RC1
This commit is contained in:
184
kexcrt/msvc/STDINT.H
Normal file
184
kexcrt/msvc/STDINT.H
Normal file
@ -0,0 +1,184 @@
|
||||
/* ISO C9x 7.18 Integer types <stdint.h>
|
||||
* Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz>
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAIMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Date: 2000-12-02
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _STDINT_H
|
||||
#define _STDINT_H
|
||||
#define __need_wint_t
|
||||
#define __need_wchar_t
|
||||
#include <stddef.h>
|
||||
|
||||
/* 7.18.1.1 Exact-width integer types */
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef short int16_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef int int32_t;
|
||||
typedef unsigned uint32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
/* 7.18.1.2 Minimum-width integer types */
|
||||
typedef signed char int_least8_t;
|
||||
typedef unsigned char uint_least8_t;
|
||||
typedef short int_least16_t;
|
||||
typedef unsigned short uint_least16_t;
|
||||
typedef int int_least32_t;
|
||||
typedef unsigned uint_least32_t;
|
||||
typedef __int64 int_least64_t;
|
||||
typedef unsigned __int64 uint_least64_t;
|
||||
|
||||
/* 7.18.1.3 Fastest minimum-width integer types
|
||||
* Not actually guaranteed to be fastest for all purposes
|
||||
* Here we use the exact-width types for 8 and 16-bit ints.
|
||||
*/
|
||||
typedef char int_fast8_t;
|
||||
typedef unsigned char uint_fast8_t;
|
||||
typedef short int_fast16_t;
|
||||
typedef unsigned short uint_fast16_t;
|
||||
typedef int int_fast32_t;
|
||||
typedef unsigned int uint_fast32_t;
|
||||
typedef __int64 int_fast64_t;
|
||||
typedef unsigned __int64 uint_fast64_t;
|
||||
|
||||
/* 7.18.1.4 Integer types capable of holding object pointers */
|
||||
typedef int intptr_t;
|
||||
typedef unsigned uintptr_t;
|
||||
|
||||
/* 7.18.1.5 Greatest-width integer types */
|
||||
typedef __int64 intmax_t;
|
||||
typedef unsigned __int64 uintmax_t;
|
||||
|
||||
/* 7.18.2 Limits of specified-width integer types */
|
||||
#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)
|
||||
|
||||
/* 7.18.2.1 Limits of exact-width integer types */
|
||||
#define INT8_MIN (-128)
|
||||
#define INT16_MIN (-32768)
|
||||
#define INT32_MIN (-2147483647 - 1)
|
||||
#define INT64_MIN (-9223372036854775807LL - 1)
|
||||
|
||||
#define INT8_MAX 127
|
||||
#define INT16_MAX 32767
|
||||
#define INT32_MAX 2147483647
|
||||
#define INT64_MAX 9223372036854775807LL
|
||||
|
||||
#define UINT8_MAX 0xff /* 255U */
|
||||
#define UINT16_MAX 0xffff /* 65535U */
|
||||
#define UINT32_MAX 0xffffffff /* 4294967295U */
|
||||
#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */
|
||||
|
||||
/* 7.18.2.2 Limits of minimum-width integer types */
|
||||
#define INT_LEAST8_MIN INT8_MIN
|
||||
#define INT_LEAST16_MIN INT16_MIN
|
||||
#define INT_LEAST32_MIN INT32_MIN
|
||||
#define INT_LEAST64_MIN INT64_MIN
|
||||
|
||||
#define INT_LEAST8_MAX INT8_MAX
|
||||
#define INT_LEAST16_MAX INT16_MAX
|
||||
#define INT_LEAST32_MAX INT32_MAX
|
||||
#define INT_LEAST64_MAX INT64_MAX
|
||||
|
||||
#define UINT_LEAST8_MAX UINT8_MAX
|
||||
#define UINT_LEAST16_MAX UINT16_MAX
|
||||
#define UINT_LEAST32_MAX UINT32_MAX
|
||||
#define UINT_LEAST64_MAX UINT64_MAX
|
||||
|
||||
/* 7.18.2.3 Limits of fastest minimum-width integer types */
|
||||
#define INT_FAST8_MIN INT8_MIN
|
||||
#define INT_FAST16_MIN INT16_MIN
|
||||
#define INT_FAST32_MIN INT32_MIN
|
||||
#define INT_FAST64_MIN INT64_MIN
|
||||
|
||||
#define INT_FAST8_MAX INT8_MAX
|
||||
#define INT_FAST16_MAX INT16_MAX
|
||||
#define INT_FAST32_MAX INT32_MAX
|
||||
#define INT_FAST64_MAX INT64_MAX
|
||||
|
||||
#define UINT_FAST8_MAX UINT8_MAX
|
||||
#define UINT_FAST16_MAX UINT16_MAX
|
||||
#define UINT_FAST32_MAX UINT32_MAX
|
||||
#define UINT_FAST64_MAX UINT64_MAX
|
||||
|
||||
/* 7.18.2.4 Limits of integer types capable of holding
|
||||
object pointers */
|
||||
#define INTPTR_MIN INT32_MIN
|
||||
#define INTPTR_MAX INT32_MAX
|
||||
#define UINTPTR_MAX UINT32_MAX
|
||||
|
||||
/* 7.18.2.5 Limits of greatest-width integer types */
|
||||
#define INTMAX_MIN INT64_MIN
|
||||
#define INTMAX_MAX INT64_MAX
|
||||
#define UINTMAX_MAX UINT64_MAX
|
||||
|
||||
/* 7.18.3 Limits of other integer types */
|
||||
#define PTRDIFF_MIN INT32_MIN
|
||||
#define PTRDIFF_MAX INT32_MAX
|
||||
|
||||
#define SIG_ATOMIC_MIN INT32_MIN
|
||||
#define SIG_ATOMIC_MAX INT32_MAX
|
||||
|
||||
#define SIZE_MAX UINT32_MAX
|
||||
|
||||
#ifndef WCHAR_MIN /* also in wchar.h */
|
||||
#define WCHAR_MIN 0
|
||||
#define WCHAR_MAX 0xffff /* UINT16_MAX */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* wint_t is unsigned short for compatibility with MS runtime
|
||||
*/
|
||||
#define WINT_MIN 0
|
||||
#define WINT_MAX 0xffff /* UINT16_MAX */
|
||||
|
||||
#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */
|
||||
|
||||
|
||||
/* 7.18.4 Macros for integer constants */
|
||||
#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS)
|
||||
|
||||
/* 7.18.4.1 Macros for minimum-width integer constants
|
||||
|
||||
Accoding to Douglas Gwyn <gwyn@arl.mil>:
|
||||
"This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
|
||||
9899:1999 as initially published, the expansion was required
|
||||
to be an integer constant of precisely matching type, which
|
||||
is impossible to accomplish for the shorter types on most
|
||||
platforms, because C99 provides no standard way to designate
|
||||
an integer constant with width less than that of type int.
|
||||
TC1 changed this to require just an integer constant
|
||||
*expression* with *promoted* type."
|
||||
*/
|
||||
|
||||
#define INT8_C(val) ((int8_t) + (val))
|
||||
#define UINT8_C(val) ((uint8_t) + (val##U))
|
||||
#define INT16_C(val) ((int16_t) + (val))
|
||||
#define UINT16_C(val) ((uint16_t) + (val##U))
|
||||
|
||||
#define INT32_C(val) val##L
|
||||
#define UINT32_C(val) val##UL
|
||||
#define INT64_C(val) val##LL
|
||||
#define UINT64_C(val) val##ULL
|
||||
|
||||
/* 7.18.4.2 Macros for greatest-width integer constants */
|
||||
#define INTMAX_C(val) INT64_C(val)
|
||||
#define UINTMAX_C(val) UINT64_C(val)
|
||||
|
||||
#endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */
|
||||
|
||||
#endif
|
112
kexcrt/msvc/argcargv.c
Normal file
112
kexcrt/msvc/argcargv.c
Normal file
@ -0,0 +1,112 @@
|
||||
//==========================================
|
||||
// LIBCTINY - Matt Pietrek 2001
|
||||
// MSDN Magazine, January 2001
|
||||
//==========================================
|
||||
#include <windows.h>
|
||||
#include "argcargv.h"
|
||||
|
||||
#define _MAX_CMD_LINE_ARGS 128
|
||||
|
||||
char * _ppszArgv[_MAX_CMD_LINE_ARGS+1];
|
||||
|
||||
int __cdecl _ConvertCommandLineToArgcArgv( void )
|
||||
{
|
||||
int cbCmdLine;
|
||||
int argc;
|
||||
PSTR pszSysCmdLine, pszCmdLine;
|
||||
|
||||
// Set to no argv elements, in case we have to bail out
|
||||
_ppszArgv[0] = 0;
|
||||
|
||||
// First get a pointer to the system's version of the command line, and
|
||||
// figure out how long it is.
|
||||
pszSysCmdLine = GetCommandLine();
|
||||
cbCmdLine = lstrlen( pszSysCmdLine );
|
||||
|
||||
// Allocate memory to store a copy of the command line. We'll modify
|
||||
// this copy, rather than the original command line. Yes, this memory
|
||||
// currently doesn't explicitly get freed, but it goes away when the
|
||||
// process terminates.
|
||||
pszCmdLine = (PSTR)HeapAlloc( GetProcessHeap(), 0, cbCmdLine+1 );
|
||||
if ( !pszCmdLine )
|
||||
return 0;
|
||||
|
||||
// Copy the system version of the command line into our copy
|
||||
lstrcpy( pszCmdLine, pszSysCmdLine );
|
||||
|
||||
if ( '"' == *pszCmdLine ) // If command line starts with a quote ("),
|
||||
{ // it's a quoted filename. Skip to next quote.
|
||||
pszCmdLine++;
|
||||
|
||||
_ppszArgv[0] = pszCmdLine; // argv[0] == executable name
|
||||
|
||||
while ( *pszCmdLine && (*pszCmdLine != '"') )
|
||||
pszCmdLine++;
|
||||
|
||||
if ( *pszCmdLine ) // Did we see a non-NULL ending?
|
||||
*pszCmdLine++ = 0; // Null terminate and advance to next char
|
||||
else
|
||||
return 0; // Oops! We didn't see the end quote
|
||||
}
|
||||
else // A regular (non-quoted) filename
|
||||
{
|
||||
_ppszArgv[0] = pszCmdLine; // argv[0] == executable name
|
||||
|
||||
while ( *pszCmdLine && (' ' != *pszCmdLine) && ('\t' != *pszCmdLine) )
|
||||
pszCmdLine++;
|
||||
|
||||
if ( *pszCmdLine )
|
||||
*pszCmdLine++ = 0; // Null terminate and advance to next char
|
||||
}
|
||||
|
||||
// Done processing argv[0] (i.e., the executable name). Now do th
|
||||
// actual arguments
|
||||
|
||||
argc = 1;
|
||||
|
||||
while ( 1 )
|
||||
{
|
||||
// Skip over any whitespace
|
||||
while ( *pszCmdLine && (' ' == *pszCmdLine) || ('\t' == *pszCmdLine) )
|
||||
pszCmdLine++;
|
||||
|
||||
if ( 0 == *pszCmdLine ) // End of command line???
|
||||
return argc;
|
||||
|
||||
if ( '"' == *pszCmdLine ) // Argument starting with a quote???
|
||||
{
|
||||
pszCmdLine++; // Advance past quote character
|
||||
|
||||
_ppszArgv[ argc++ ] = pszCmdLine;
|
||||
_ppszArgv[ argc ] = 0;
|
||||
|
||||
// Scan to end quote, or NULL terminator
|
||||
while ( *pszCmdLine && (*pszCmdLine != '"') )
|
||||
pszCmdLine++;
|
||||
|
||||
if ( 0 == *pszCmdLine )
|
||||
return argc;
|
||||
|
||||
if ( *pszCmdLine )
|
||||
*pszCmdLine++ = 0; // Null terminate and advance to next char
|
||||
}
|
||||
else // Non-quoted argument
|
||||
{
|
||||
_ppszArgv[ argc++ ] = pszCmdLine;
|
||||
_ppszArgv[ argc ] = 0;
|
||||
|
||||
// Skip till whitespace or NULL terminator
|
||||
while ( *pszCmdLine && (' '!=*pszCmdLine) && ('\t'!=*pszCmdLine) )
|
||||
pszCmdLine++;
|
||||
|
||||
if ( 0 == *pszCmdLine )
|
||||
return argc;
|
||||
|
||||
if ( *pszCmdLine )
|
||||
*pszCmdLine++ = 0; // Null terminate and advance to next char
|
||||
}
|
||||
|
||||
if ( argc >= (_MAX_CMD_LINE_ARGS) )
|
||||
return argc;
|
||||
}
|
||||
}
|
3
kexcrt/msvc/argcargv.h
Normal file
3
kexcrt/msvc/argcargv.h
Normal file
@ -0,0 +1,3 @@
|
||||
extern char * _ppszArgv[];
|
||||
|
||||
int __cdecl _ConvertCommandLineToArgcArgv( void );
|
20
kexcrt/msvc/concrt0.c
Normal file
20
kexcrt/msvc/concrt0.c
Normal file
@ -0,0 +1,20 @@
|
||||
#include <windows.h>
|
||||
#include "argcargv.h"
|
||||
#include "init.h"
|
||||
|
||||
int main(int, char **);
|
||||
|
||||
void mainCRTStartup(void)
|
||||
{
|
||||
int mainret, argc;
|
||||
|
||||
argc = _ConvertCommandLineToArgcArgv();
|
||||
|
||||
__init();
|
||||
|
||||
mainret = main(argc, _ppszArgv);
|
||||
|
||||
__exit();
|
||||
|
||||
ExitProcess(mainret);
|
||||
}
|
27
kexcrt/msvc/dllcrt0.c
Normal file
27
kexcrt/msvc/dllcrt0.c
Normal file
@ -0,0 +1,27 @@
|
||||
#include <windows.h>
|
||||
#include "init.h"
|
||||
|
||||
extern BOOL WINAPI DllMain(
|
||||
HINSTANCE hDllHandle,
|
||||
DWORD dwReason,
|
||||
LPVOID lpReserved
|
||||
);
|
||||
|
||||
BOOL WINAPI _DllMainCRTStartup(
|
||||
HINSTANCE hDllHandle,
|
||||
DWORD dwReason,
|
||||
LPVOID lpReserved
|
||||
)
|
||||
{
|
||||
BOOL ret;
|
||||
|
||||
if (dwReason == DLL_PROCESS_ATTACH)
|
||||
__init();
|
||||
|
||||
ret = DllMain(hDllHandle, dwReason, lpReserved);
|
||||
|
||||
if (dwReason == DLL_PROCESS_DETACH)
|
||||
__exit();
|
||||
|
||||
return ret;
|
||||
}
|
85
kexcrt/msvc/init.c
Normal file
85
kexcrt/msvc/init.c
Normal file
@ -0,0 +1,85 @@
|
||||
#include <stdlib.h>
|
||||
#include "init.h"
|
||||
|
||||
#define MAX_ATEXIT 32
|
||||
|
||||
typedef void (__cdecl *_PVFV)(void);
|
||||
|
||||
static _PVFV _atexitlist[MAX_ATEXIT];
|
||||
static int _atexitlist_cnt;
|
||||
|
||||
// C initializers
|
||||
#pragma data_seg(".CRT$XIA")
|
||||
_PVFV __xi_a[] = { NULL };
|
||||
#pragma data_seg(".CRT$XIZ")
|
||||
_PVFV __xi_z[] = { NULL };
|
||||
|
||||
// C++ initializers
|
||||
#pragma data_seg(".CRT$XCA")
|
||||
_PVFV __xc_a[] = { NULL };
|
||||
#pragma data_seg(".CRT$XCZ")
|
||||
_PVFV __xc_z[] = { NULL };
|
||||
|
||||
// C pre-terminators
|
||||
#pragma data_seg(".CRT$XPA")
|
||||
_PVFV __xp_a[] = { NULL };
|
||||
#pragma data_seg(".CRT$XPZ")
|
||||
_PVFV __xp_z[] = { NULL };
|
||||
|
||||
// C terminators
|
||||
#pragma data_seg(".CRT$XTA")
|
||||
_PVFV __xt_a[] = { NULL };
|
||||
#pragma data_seg(".CRT$XTZ")
|
||||
_PVFV __xt_z[] = { NULL };
|
||||
|
||||
#pragma data_seg() /* reset */
|
||||
|
||||
#pragma comment(linker, "/merge:.CRT=.data")
|
||||
|
||||
static void _initterm(_PVFV * pfbegin, _PVFV * pfend)
|
||||
{
|
||||
while (pfbegin < pfend)
|
||||
{
|
||||
if (*pfbegin != NULL)
|
||||
(**pfbegin)();
|
||||
++pfbegin;
|
||||
}
|
||||
}
|
||||
|
||||
void __init(void)
|
||||
{
|
||||
// do initializations
|
||||
_initterm( __xi_a, __xi_z );
|
||||
// do C++ initializations
|
||||
_initterm( __xc_a, __xc_z );
|
||||
}
|
||||
|
||||
int atexit(_PVFV func)
|
||||
{
|
||||
if (_atexitlist_cnt < MAX_ATEXIT)
|
||||
{
|
||||
_atexitlist[_atexitlist_cnt++] = func;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void __exit(void)
|
||||
{
|
||||
// do pre-terminators
|
||||
_initterm(__xp_a, __xp_z);
|
||||
// do terminators
|
||||
_initterm(__xt_a, __xt_z);
|
||||
|
||||
if (_atexitlist_cnt)
|
||||
{
|
||||
_PVFV* p;
|
||||
for (p = _atexitlist + _atexitlist_cnt - 1 ; p >= _atexitlist ; p--)
|
||||
{
|
||||
if (*p != NULL)
|
||||
(**p)();
|
||||
p--;
|
||||
}
|
||||
}
|
||||
}
|
7
kexcrt/msvc/init.h
Normal file
7
kexcrt/msvc/init.h
Normal file
@ -0,0 +1,7 @@
|
||||
#ifndef __INIT_H
|
||||
#define __INIT_H
|
||||
|
||||
void __init(void);
|
||||
void __exit(void);
|
||||
|
||||
#endif
|
53
kexcrt/msvc/wincrt0.c
Normal file
53
kexcrt/msvc/wincrt0.c
Normal file
@ -0,0 +1,53 @@
|
||||
#include <windows.h>
|
||||
#include "init.h"
|
||||
|
||||
void WinMainCRTStartup(void)
|
||||
{
|
||||
int mainret;
|
||||
char* lpszCommandLine;
|
||||
STARTUPINFO StartupInfo;
|
||||
|
||||
lpszCommandLine = GetCommandLine();
|
||||
|
||||
// Skip past program name (first token in command line).
|
||||
|
||||
if ( *lpszCommandLine == '"' ) // Check for and handle quoted program name
|
||||
{
|
||||
lpszCommandLine++; // Get past the first quote
|
||||
|
||||
// Now, scan, and skip over, subsequent characters until another
|
||||
// double-quote or a null is encountered
|
||||
while( *lpszCommandLine && (*lpszCommandLine != '"') )
|
||||
lpszCommandLine++;
|
||||
|
||||
// If we stopped on a double-quote (usual case), skip over it.
|
||||
|
||||
if ( *lpszCommandLine == '"' )
|
||||
lpszCommandLine++;
|
||||
}
|
||||
else // First token wasn't a quote
|
||||
{
|
||||
while ( *lpszCommandLine > ' ' )
|
||||
lpszCommandLine++;
|
||||
}
|
||||
|
||||
// Skip past any white space preceeding the second token.
|
||||
|
||||
while ( *lpszCommandLine && (*lpszCommandLine <= ' ') )
|
||||
lpszCommandLine++;
|
||||
|
||||
StartupInfo.dwFlags = 0;
|
||||
GetStartupInfo( &StartupInfo );
|
||||
|
||||
__init();
|
||||
|
||||
mainret = WinMain( GetModuleHandle(NULL),
|
||||
NULL,
|
||||
lpszCommandLine,
|
||||
StartupInfo.dwFlags & STARTF_USESHOWWINDOW
|
||||
? StartupInfo.wShowWindow : SW_SHOWDEFAULT );
|
||||
|
||||
__exit();
|
||||
|
||||
ExitProcess(mainret);
|
||||
}
|
Reference in New Issue
Block a user