Cleaned up code a bit

svn path=/trunk/; revision=339
This commit is contained in:
David Welch 1999-03-25 00:37:06 +00:00
parent 3f0a7424cb
commit 8688a2a272
80 changed files with 1191 additions and 1213 deletions

View file

@ -184,8 +184,8 @@ typedef NTSTATUS (*PDRIVER_INITIALIZE)(struct _DRIVER_OBJECT* DriverObject,
/* /*
* Driver cancel declaration * Driver cancel declaration
*/ */
typedef NTSTATUS (*PDRIVER_CANCEL)(struct _DRIVER_OBJECT* DriverObject, typedef NTSTATUS (*PDRIVER_CANCEL)(struct _DEVICE_OBJECT* DeviceObject,
PUNICODE_STRING RegistryPath); struct _IRP* RegistryPath);
typedef struct _SECTION_OBJECT_POINTERS typedef struct _SECTION_OBJECT_POINTERS

View file

@ -13,6 +13,7 @@
#define SET_LARGE_INTEGER_LOW_PART(LI, LP) \ #define SET_LARGE_INTEGER_LOW_PART(LI, LP) \
( (LI) = ((LI) & 0xFFFFFFFF00000000L) | (LP) ) ( (LI) = ((LI) & 0xFFFFFFFF00000000L) | (LP) )
#define LARGE_INTEGER_QUAD_PART(LI) (LI) #define LARGE_INTEGER_QUAD_PART(LI) (LI)
#define INITIALIZE_LARGE_INTEGER (0)
typedef long long int LONGLONG, *PLONGLONG; typedef long long int LONGLONG, *PLONGLONG;
typedef unsigned long long int ULONGLONG, *PULONGLONG; typedef unsigned long long int ULONGLONG, *PULONGLONG;
@ -26,6 +27,7 @@ typedef unsigned long long int ULONGLONG, *PULONGLONG;
#define SET_LARGE_INTEGER_LOW_PART(LargeInteger,Unsigned_Long) \ #define SET_LARGE_INTEGER_LOW_PART(LargeInteger,Unsigned_Long) \
((LargeInteger).LowPart = (Unsigned_Long)) ((LargeInteger).LowPart = (Unsigned_Long))
#define LARGE_INTEGER_QUAD_PART(LI) (*(LONGLONG *)(&(LI))) #define LARGE_INTEGER_QUAD_PART(LI) (*(LONGLONG *)(&(LI)))
#define INITIALIZE_LARGE_INTEGER ({0,0})
typedef double LONGLONG, *PLONGLONG; typedef double LONGLONG, *PLONGLONG;
typedef double ULONGLONG, *PULONGLONG; typedef double ULONGLONG, *PULONGLONG;

View file

@ -145,7 +145,7 @@ LONG RtlCompareUnicodeString(PUNICODE_STRING String1,
LARGE_INTEGER RtlConvertLongToLargeInteger(LONG SignedInteger); LARGE_INTEGER RtlConvertLongToLargeInteger(LONG SignedInteger);
LARGE_INTEGER RtlConvertUlongToLargeInteger(ULONG UnsignedInteger); LARGE_INTEGER RtlConvertUlongToLargeInteger(ULONG UnsignedInteger);
VOID RtlCopyBytes(PVOID Destination, CONST VOID* Source, ULONG Length); VOID RtlCopyBytes(PVOID Destination, CONST VOID* Source, ULONG Length);
VOID RtlCopyMemory(VOID* Destination, VOID* Source, ULONG Length); VOID RtlCopyMemory(VOID* Destination, CONST VOID* Source, ULONG Length);
VOID RtlCopyString(PSTRING DestinationString, PSTRING SourceString); VOID RtlCopyString(PSTRING DestinationString, PSTRING SourceString);
VOID RtlCopyUnicodeString(PUNICODE_STRING DestinationString, VOID RtlCopyUnicodeString(PUNICODE_STRING DestinationString,
PUNICODE_STRING SourceString); PUNICODE_STRING SourceString);

View file

@ -30,6 +30,7 @@ NTSTATUS IoInitializeDriver(PDRIVER_INITIALIZE DriverEntry);
VOID IoInitCancelHandling(VOID); VOID IoInitCancelHandling(VOID);
VOID IoInitSymbolicLinkImplementation(VOID); VOID IoInitSymbolicLinkImplementation(VOID);
VOID IoInitFileSystemImplementation(VOID);
NTSTATUS IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject); NTSTATUS IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject);
POBJECT IoOpenSymlink(POBJECT SymbolicLink); POBJECT IoOpenSymlink(POBJECT SymbolicLink);
@ -54,5 +55,6 @@ NTSTATUS IopCreateDevice(PVOID ObjectBody,
PVOID Parent, PVOID Parent,
PWSTR RemainingPath, PWSTR RemainingPath,
POBJECT_ATTRIBUTES ObjectAttributes); POBJECT_ATTRIBUTES ObjectAttributes);
NTSTATUS IoAttachVpb(PDEVICE_OBJECT DeviceObject);
#endif #endif

View file

@ -18,6 +18,7 @@
VOID KeAcquireDispatcherDatabaseLock(BOOLEAN Wait); VOID KeAcquireDispatcherDatabaseLock(BOOLEAN Wait);
VOID KeReleaseDispatcherDatabaseLock(BOOLEAN Wait); VOID KeReleaseDispatcherDatabaseLock(BOOLEAN Wait);
VOID KeDispatcherObjectWake(DISPATCHER_HEADER* hdr); VOID KeDispatcherObjectWake(DISPATCHER_HEADER* hdr);
VOID KeDispatcherObjectWakeAll(DISPATCHER_HEADER* hdr);
VOID KiInterruptDispatch(ULONG irq); VOID KiInterruptDispatch(ULONG irq);
VOID KiDispatchInterrupt(ULONG irq); VOID KiDispatchInterrupt(ULONG irq);
@ -36,10 +37,10 @@ VOID KeInitExceptions(VOID);
VOID KeInitIRQ(VOID); VOID KeInitIRQ(VOID);
VOID KeInitTimer(VOID); VOID KeInitTimer(VOID);
VOID KeInitDpc(VOID); VOID KeInitDpc(VOID);
VOID KeInitBugCheck(VOID);
VOID KeInitDispatcher(VOID); VOID KeInitDispatcher(VOID);
VOID KeCalibrateTimerLoop(VOID); VOID KeCalibrateTimerLoop(VOID);
VOID KeInitializeDispatcher(VOID); VOID KeInitializeDispatcher(VOID);
VOID KeInitializeTimerImpl(VOID); VOID KeInitializeTimerImpl(VOID);
VOID KeInitializeBugCheck(VOID);
#endif #endif

View file

@ -2,5 +2,7 @@
NTSTATUS LdrLoadDriver(PUNICODE_STRING Filename); NTSTATUS LdrLoadDriver(PUNICODE_STRING Filename);
NTSTATUS LdrLoadInitialProcess(VOID); NTSTATUS LdrLoadInitialProcess(VOID);
VOID LdrLoadAutoConfigDrivers(VOID); VOID LdrLoadAutoConfigDrivers(VOID);
VOID LdrInitModuleManagement(VOID);
NTSTATUS LdrProcessDriver(PVOID ModuleLoadBase);

View file

@ -0,0 +1 @@
VOID NtInitializeEventImplementation(VOID);

View file

@ -60,6 +60,7 @@ PVOID ObCreateObject(PHANDLE Handle,
POBJECT_ATTRIBUTES ObjectAttributes, POBJECT_ATTRIBUTES ObjectAttributes,
POBJECT_TYPE Type); POBJECT_TYPE Type);
VOID ObRemoveEntry(POBJECT_HEADER Header); VOID ObRemoveEntry(POBJECT_HEADER Header);
NTSTATUS ObPerformRetentionChecks(POBJECT_HEADER Header);
/* /*
* FUNCTION: Creates an entry within a directory * FUNCTION: Creates an entry within a directory
@ -106,6 +107,9 @@ NTSTATUS ObCreateHandle(PEPROCESS Process,
VOID ObCreateHandleTable(PEPROCESS Parent, VOID ObCreateHandleTable(PEPROCESS Parent,
BOOLEAN Inherit, BOOLEAN Inherit,
PEPROCESS Process); PEPROCESS Process);
NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
PVOID* ReturnedObject,
PWSTR* RemainingPath);
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */ #endif /* __INCLUDE_INTERNAL_OBJMGR_H */

View file

@ -14,6 +14,8 @@ VOID PsInitProcessManagment(VOID);
VOID PsInitIdleThread(VOID); VOID PsInitIdleThread(VOID);
VOID PsDispatchThread(VOID); VOID PsDispatchThread(VOID);
VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus); VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus);
VOID PsTerminateOtherThread(PETHREAD Thread, NTSTATUS ExitStatus);
VOID PsReleaseThread(PETHREAD Thread);
/* /*
* PURPOSE: Thread states * PURPOSE: Thread states
@ -54,5 +56,6 @@ void HalInitFirstTask(PETHREAD thread);
BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext); BOOLEAN HalInitTask(PETHREAD thread, PKSTART_ROUTINE fn, PVOID StartContext);
void HalTaskSwitch(PKTHREAD thread); void HalTaskSwitch(PKTHREAD thread);
NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context); NTSTATUS HalInitTaskWithContext(PETHREAD Thread, PCONTEXT Context);
NTSTATUS HalReleaseTask(PETHREAD Thread);
#endif #endif

View file

@ -1,60 +0,0 @@
#ifndef _LINUX_TYPES_H
#define _LINUX_TYPES_H
#ifndef NULL
# define NULL ((void *) 0)
#endif
#ifndef _I386_TYPES_H
#define _I386_TYPES_H
/*
* __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
* header files exported to user space
*/
typedef __signed__ char __s8;
typedef unsigned char __u8;
typedef __signed__ short __s16;
typedef unsigned short __u16;
typedef __signed__ int __s32;
typedef unsigned int __u32;
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
typedef __signed__ long long __s64;
typedef unsigned long long __u64;
#endif
/*
* These aren't exported outside the kernel to avoid name space clashes
*/
#ifdef __KERNEL__
typedef signed char s8;
typedef unsigned char u8;
typedef signed short s16;
typedef unsigned short u16;
typedef signed int s32;
typedef unsigned int u32;
typedef signed long long s64;
typedef unsigned long long u64;
#endif /* __KERNEL__ */
#endif
#ifndef SIZE_T_DEFINED
#define SIZE_T_DEFINED
typedef unsigned int size_t;
#endif
typedef size_t __kernel_size_t;
#endif /* _LINUX_TYPES_H */

View file

@ -0,0 +1,16 @@
typedef NTSTATUS (*PEPFUNC)(VOID);
typedef struct _DLL
{
PIMAGE_NT_HEADERS Headers;
PVOID BaseAddress;
HANDLE SectionHandle;
struct _DLL* Prev;
struct _DLL* Next;
} DLL, *PDLL;
#define RVA(m, b) ((ULONG)b + m)
extern DLL LdrDllListHead;
PEPFUNC LdrPEStartup(PVOID ImageBase, HANDLE SectionHandle);

View file

@ -1,5 +1,7 @@
extern void dprintf(char* fmt,...); extern void dprintf(char* fmt,...);
#define UNIMPLEMENTED dprintf("%s in %s:%d is unimplemented\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef NDEBUG #ifdef NDEBUG
#define DPRINT(args...) #define DPRINT(args...)
#else #else

View file

@ -0,0 +1,9 @@
VOID WINAPI __RtlInitHeap(PVOID base, ULONG minsize, ULONG maxsize);
#define HEAP_BASE (0xa0000000)
VOID RtlDeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
VOID RtlEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
VOID RtlInitializeCriticalSection(LPCRITICAL_SECTION pcritical);
VOID RtlLeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
WINBOOL RtlTryEntryCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

View file

@ -433,8 +433,8 @@ RtlUnlockHeap@4
RtlValidateHeap@12 RtlValidateHeap@12
RtlInitAnsiString RtlInitAnsiString
RtlInitUnicodeString RtlInitUnicodeString
RtlLargeIntegerDivide
RtlLargeIntegerAdd RtlLargeIntegerAdd
RtlLargeIntegerDivide
RtlEnlargedIntegerMultiply RtlEnlargedIntegerMultiply
RtlEnlargedUnsignedMultiply RtlEnlargedUnsignedMultiply
RtlExtendedIntegerMultiply RtlExtendedIntegerMultiply
@ -455,9 +455,9 @@ wcscpy
wcschr wcschr
wcscat wcscat
wcscmp wcscmp
wcsicmp
wcsnicmp
wcsncpy wcsncpy
wcslen wcslen
wcsrchr wcsrchr
wcsicmp
wcsnicmp
vsprintf vsprintf

View file

@ -14,221 +14,20 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <pe.h> #include <pe.h>
#include <string.h> #include <string.h>
#include <internal/string.h>
#include <wchar.h> #include <wchar.h>
#include <ntdll/ldr.h>
#include <ntdll/rtl.h>
//#define NDEBUG //#define NDEBUG
#include <ntdll/ntdll.h> #include <ntdll/ntdll.h>
PVOID WINAPI __RtlInitHeap(LPVOID base, ULONG minsize, ULONG maxsize);
/* MACROS ********************************************************************/
#define RVA(m, b) ((ULONG)b + m)
/* TYPEDEFS ******************************************************************/
typedef NTSTATUS (*PEPFUNC)(VOID);
typedef struct _DLL
{
PIMAGE_NT_HEADERS Headers;
PVOID BaseAddress;
struct _DLL* Prev;
struct _DLL* Next;
} DLL, *PDLL;
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
static DLL DllListHead; DLL LdrDllListHead;
extern unsigned int _image_base__;
#define HEAP_BASE (0xa0000000)
/* FORWARD DECLARATIONS ******************************************************/
static PEPFUNC LdrPEStartup(DWORD ImageBase, HANDLE SectionHandle);
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
static NTSTATUS LdrMapSections(PVOID ImageBase, HANDLE SectionHandle,
PIMAGE_NT_HEADERS NTHeaders)
{
ULONG i;
NTSTATUS Status;
for (i=0; i<NTHeaders->FileHeader.NumberOfSections; i++)
{
PIMAGE_SECTION_HEADER Sections;
LARGE_INTEGER Offset;
ULONG Base;
Sections = (PIMAGE_SECTION_HEADER)SECHDROFFSET(ImageBase);
Base = Sections[i].VirtualAddress + ImageBase;
SET_LARGE_INTEGER_HIGH_PART(Offset,0);
SET_LARGE_INTEGER_LOW_PART(Offset,Sections[i].PointerToRawData);
Status = ZwMapViewOfSection(SectionHandle,
NtCurrentProcess(),
(PVOID *)&Base,
0,
Sections[i].Misc.VirtualSize,
&Offset,
&Sections[i].Misc.VirtualSize,
0,
MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
return Status;
}
}
return(STATUS_SUCCESS);
}
static NTSTATUS LdrLoadDll(PDLL* Base, PCHAR Name)
{
char fqname[255] = "\\??\\C:\\reactos\\system\\";
ANSI_STRING AnsiString;
UNICODE_STRING UnicodeString;
OBJECT_ATTRIBUTES FileObjectAttributes;
char BlockBuffer[1024];
PIMAGE_DOS_HEADER DosHeader;
NTSTATUS Status;
PIMAGE_NT_HEADERS NTHeaders;
PEPFUNC DllStartupAddr;
ULONG ImageBase, ImageSize, InitialViewSize;
HANDLE FileHandle, SectionHandle;
PDLL DllDesc;
DPRINT("LdrLoadDll(Base %x, Name %s)\n",Base,Name);
strcat(fqname, Name);
DPRINT("fqname %s\n",fqname);
RtlInitAnsiString(&AnsiString,fqname);
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
InitializeObjectAttributes(&FileObjectAttributes,
&UnicodeString,
0,
NULL,
NULL);
DPRINT("Opening dll\n");
Status = ZwOpenFile(&FileHandle, FILE_ALL_ACCESS, &FileObjectAttributes,
NULL, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT("Dll open failed ");
return Status;
}
Status = ZwReadFile(FileHandle, 0, 0, 0, 0, BlockBuffer, 1024, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT("Dll header read failed ");
ZwClose(FileHandle);
return Status;
}
DosHeader = (PIMAGE_DOS_HEADER) BlockBuffer;
if (DosHeader->e_magic != IMAGE_DOS_MAGIC ||
DosHeader->e_lfanew == 0L ||
*(PULONG)((PUCHAR)BlockBuffer + DosHeader->e_lfanew) != IMAGE_PE_MAGIC)
{
DPRINT("NTDLL format invalid\n");
ZwClose(FileHandle);
return STATUS_UNSUCCESSFUL;
}
NTHeaders = (PIMAGE_NT_HEADERS)(BlockBuffer + DosHeader->e_lfanew);
ImageBase = NTHeaders->OptionalHeader.ImageBase;
ImageSize = NTHeaders->OptionalHeader.SizeOfImage;
DPRINT("ImageBase %x\n",ImageBase);
DllStartupAddr = ImageBase + NTHeaders->OptionalHeader.AddressOfEntryPoint;
/* Create a section for NTDLL */
Status = ZwCreateSection(&SectionHandle,
SECTION_ALL_ACCESS,
NULL,
NULL,
PAGE_READWRITE,
MEM_COMMIT,
FileHandle);
if (!NT_SUCCESS(Status))
{
DPRINT("NTDLL create section failed ");
ZwClose(FileHandle);
return Status;
}
/* Map the NTDLL into the process */
InitialViewSize = DosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)
+ sizeof(IMAGE_SECTION_HEADER) * NTHeaders->FileHeader.NumberOfSections;
Status = ZwMapViewOfSection(SectionHandle,
NtCurrentProcess(),
(PVOID *)&ImageBase,
0,
InitialViewSize,
NULL,
&InitialViewSize,
0,
MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
DPRINT("NTDLL map view of secion failed ");
ZwClose(FileHandle);
return Status;
}
ZwClose(FileHandle);
DllDesc = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(DLL));
DllDesc->Headers = NTHeaders;
DllDesc->BaseAddress = ImageBase;
DllDesc->Next = DllListHead.Next;
DllDesc->Prev = &DllListHead;
DllListHead.Next->Prev = DllDesc;
DllListHead.Next = DllDesc;
LdrPEStartup(ImageBase, SectionHandle);
*Base = DllDesc;
return(STATUS_SUCCESS);
}
static NTSTATUS LdrFindDll(PDLL* Base, PCHAR Name)
{
PIMAGE_EXPORT_DIRECTORY ExportDir;
DLL* current;
PIMAGE_OPTIONAL_HEADER OptionalHeader;
DPRINT("LdrFindDll(Name %s)\n",Name);
current = &DllListHead;
do
{
OptionalHeader = &current->Headers->OptionalHeader;
ExportDir = (PIMAGE_EXPORT_DIRECTORY)OptionalHeader->DataDirectory[
IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
ExportDir = ((ULONG)ExportDir + (ULONG)current->BaseAddress);
DPRINT("Scanning %s\n",ExportDir->Name + current->BaseAddress);
if (strcmp(ExportDir->Name + current->BaseAddress, Name) == 0)
{
*Base = current;
return(STATUS_SUCCESS);
}
current = current->Next;
} while (current != &DllListHead);
DPRINT("Failed to find dll %s\n",Name);
return(LdrLoadDll(Base, Name));
}
/* LdrStartup /* LdrStartup
* FUNCTION: * FUNCTION:
* Handles Process Startup Activities. * Handles Process Startup Activities.
@ -245,11 +44,13 @@ VOID LdrStartup(HANDLE SectionHandle, DWORD ImageBase)
DPRINT("LdrStartup(ImageBase %x, SectionHandle %x)\n",ImageBase, DPRINT("LdrStartup(ImageBase %x, SectionHandle %x)\n",ImageBase,
SectionHandle); SectionHandle);
DllListHead.BaseAddress = 0x80000000; DPRINT("&_image_base__ %x\n",&_image_base__);
DllListHead.Prev = &DllListHead; LdrDllListHead.BaseAddress = (PVOID)&_image_base__;
DllListHead.Next = &DllListHead; LdrDllListHead.Prev = &LdrDllListHead;
PEDosHeader = (PIMAGE_DOS_HEADER)DllListHead.BaseAddress; LdrDllListHead.Next = &LdrDllListHead;
DllListHead.Headers = (PIMAGE_NT_HEADERS)(DllListHead.BaseAddress + LdrDllListHead.SectionHandle = SectionHandle;
PEDosHeader = (PIMAGE_DOS_HEADER)LdrDllListHead.BaseAddress;
LdrDllListHead.Headers = (PIMAGE_NT_HEADERS)(LdrDllListHead.BaseAddress +
PEDosHeader->e_lfanew); PEDosHeader->e_lfanew);
/* If MZ header exists */ /* If MZ header exists */
@ -263,10 +64,10 @@ VOID LdrStartup(HANDLE SectionHandle, DWORD ImageBase)
} }
NTHeaders = (PIMAGE_NT_HEADERS)(ImageBase + PEDosHeader->e_lfanew); NTHeaders = (PIMAGE_NT_HEADERS)(ImageBase + PEDosHeader->e_lfanew);
__RtlInitHeap(HEAP_BASE, __RtlInitHeap((PVOID)HEAP_BASE,
NTHeaders->OptionalHeader.SizeOfHeapCommit, NTHeaders->OptionalHeader.SizeOfHeapCommit,
NTHeaders->OptionalHeader.SizeOfHeapReserve); NTHeaders->OptionalHeader.SizeOfHeapReserve);
EntryPoint = LdrPEStartup(ImageBase, SectionHandle); EntryPoint = LdrPEStartup((PVOID)ImageBase, SectionHandle);
if (EntryPoint == NULL) if (EntryPoint == NULL)
{ {
@ -278,234 +79,3 @@ VOID LdrStartup(HANDLE SectionHandle, DWORD ImageBase)
Status = EntryPoint(); Status = EntryPoint();
ZwTerminateProcess(NtCurrentProcess(),Status); ZwTerminateProcess(NtCurrentProcess(),Status);
} }
static PVOID LdrGetExportByOrdinal(PDLL Module, ULONG Ordinal)
{
PIMAGE_EXPORT_DIRECTORY ExportDir;
USHORT* ExOrdinals;
ExportDir = (Module->BaseAddress +
(Module->Headers->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
ExOrdinals = (USHORT*)RVA(Module->BaseAddress,
ExportDir->AddressOfNameOrdinals);
return(ExOrdinals[Ordinal - ExportDir->Base]);
}
static PVOID LdrGetExportByName(PDLL Module, PUCHAR SymbolName)
{
PIMAGE_EXPORT_DIRECTORY ExportDir;
PDWORD* ExFunctions;
PDWORD* ExNames;
USHORT* ExOrdinals;
ULONG i;
PVOID ExName;
ULONG Ordinal;
DPRINT("LdrFindExport(Module %x, SymbolName %s)\n",
Module, SymbolName);
ExportDir = (Module->BaseAddress +
(Module->Headers->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
/* Get header pointers */
ExNames = (PDWORD*)RVA(Module->BaseAddress, ExportDir->AddressOfNames);
ExOrdinals = (USHORT*)RVA(Module->BaseAddress,
ExportDir->AddressOfNameOrdinals);
ExFunctions = (PDWORD*)RVA(Module->BaseAddress,
ExportDir->AddressOfFunctions);
for (i=0; i<ExportDir->NumberOfFunctions; i++)
{
ExName = RVA(Module->BaseAddress, ExNames[i]);
if (strcmp(ExName,SymbolName) == 0)
{
Ordinal = ExOrdinals[i];
return(RVA(Module->BaseAddress, ExFunctions[Ordinal]));
}
}
return(NULL);
}
static NTSTATUS LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
DWORD ImageBase)
{
USHORT NumberOfEntries;
PUSHORT pValue16;
ULONG RelocationRVA;
ULONG Delta32, Offset;
PULONG pValue32;
PRELOCATION_DIRECTORY RelocationDir;
PRELOCATION_ENTRY RelocationBlock;
int i;
RelocationRVA = NTHeaders->OptionalHeader.DataDirectory[
IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
if (RelocationRVA)
{
RelocationDir = (PRELOCATION_DIRECTORY)((PCHAR)ImageBase +
RelocationRVA);
while (RelocationDir->SizeOfBlock)
{
Delta32 = (unsigned long)(ImageBase -
NTHeaders->OptionalHeader.ImageBase);
RelocationBlock = (PRELOCATION_ENTRY)
(RelocationRVA + ImageBase + sizeof(RELOCATION_DIRECTORY));
NumberOfEntries =
(RelocationDir->SizeOfBlock - sizeof(RELOCATION_DIRECTORY)) /
sizeof(RELOCATION_ENTRY);
for (i = 0; i < NumberOfEntries; i++)
{
Offset = (RelocationBlock[i].TypeOffset & 0xfff) +
RelocationDir->VirtualAddress;
switch (RelocationBlock[i].TypeOffset >> 12)
{
case TYPE_RELOC_ABSOLUTE:
break;
case TYPE_RELOC_HIGH:
pValue16 = (PUSHORT) (ImageBase + Offset);
*pValue16 += Delta32 >> 16;
break;
case TYPE_RELOC_LOW:
pValue16 = (PUSHORT)(ImageBase + Offset);
*pValue16 += Delta32 & 0xffff;
break;
case TYPE_RELOC_HIGHLOW:
pValue32 = (PULONG) (ImageBase + Offset);
*pValue32 += Delta32;
break;
case TYPE_RELOC_HIGHADJ:
/* FIXME: do the highadjust fixup */
DPRINT("TYPE_RELOC_HIGHADJ fixup not implemented"
", sorry\n");
return(STATUS_UNSUCCESSFUL);
default:
DPRINT("unexpected fixup type\n");
return(STATUS_UNSUCCESSFUL);
}
}
RelocationRVA += RelocationDir->SizeOfBlock;
RelocationDir = (PRELOCATION_DIRECTORY)(ImageBase +
RelocationRVA);
}
}
return(STATUS_SUCCESS);
}
static NTSTATUS LdrFixupImports(PIMAGE_NT_HEADERS NTHeaders,
DWORD ImageBase)
{
PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory;
ULONG Ordinal;
PDLL Module;
NTSTATUS Status;
/* Process each import module */
ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY)
(ImageBase + NTHeaders->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (ImportModuleDirectory->dwRVAModuleName)
{
PVOID *ImportAddressList;
PULONG FunctionNameList;
DWORD pName;
PWORD pHint;
Status = LdrFindDll(&Module,
(PCHAR)(ImageBase +
ImportModuleDirectory->dwRVAModuleName));
if (!NT_SUCCESS(Status))
{
return 0;
}
/* Get the import address list */
ImportAddressList = (PVOID *)
(NTHeaders->OptionalHeader.ImageBase +
ImportModuleDirectory->dwRVAFunctionAddressList);
/* Get the list of functions to import */
if (ImportModuleDirectory->dwRVAFunctionNameList != 0)
{
FunctionNameList = (PULONG) (ImageBase +
ImportModuleDirectory->dwRVAFunctionNameList);
}
else
{
FunctionNameList = (PULONG) (ImageBase +
ImportModuleDirectory->dwRVAFunctionAddressList);
}
/* Walk through function list and fixup addresses */
while(*FunctionNameList != 0L)
{
if ((*FunctionNameList) & 0x80000000)
{
Ordinal = (*FunctionNameList) & 0x7fffffff;
*ImportAddressList = LdrGetExportByOrdinal(Module, Ordinal);
}
else
{
pName = (DWORD)(ImageBase + *FunctionNameList + 2);
pHint = (PWORD)(ImageBase + *FunctionNameList);
*ImportAddressList = LdrGetExportByName(Module,pName);
if ((*ImportAddressList) == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
}
ImportAddressList++;
FunctionNameList++;
}
ImportModuleDirectory++;
}
return(STATUS_SUCCESS);
}
static PEPFUNC LdrPEStartup(DWORD ImageBase, HANDLE SectionHandle)
{
NTSTATUS Status;
PEPFUNC EntryPoint;
PIMAGE_DOS_HEADER DosHeader;
PIMAGE_NT_HEADERS NTHeaders;
DosHeader = (PIMAGE_DOS_HEADER) ImageBase;
NTHeaders = (PIMAGE_NT_HEADERS)(ImageBase + DosHeader->e_lfanew);
/* Initialize Image sections */
LdrMapSections(ImageBase, SectionHandle, NTHeaders);
if (ImageBase != (DWORD) NTHeaders->OptionalHeader.ImageBase)
{
Status = LdrPerformRelocations(NTHeaders, ImageBase);
if (!NT_SUCCESS(Status))
{
return(NULL);
}
}
if (NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].
VirtualAddress != 0)
{
Status = LdrFixupImports(NTHeaders, ImageBase);
if (!NT_SUCCESS(Status))
{
return(NULL);
}
}
EntryPoint = ImageBase + NTHeaders->OptionalHeader.AddressOfEntryPoint;
return(EntryPoint);
}

View file

@ -0,0 +1,442 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: lib/ntdll/ldr/startup.c
* PURPOSE: Process startup for PE executables
* PROGRAMMERS: Jean Michault
* Rex Jolliff (rex@lvcablemodem.com)
*/
/* INCLUDES *****************************************************************/
#define WIN32_NO_PEHDR
#include <windows.h>
#include <ddk/ntddk.h>
#include <pe.h>
#include <string.h>
#include <internal/string.h>
#include <wchar.h>
#include <ntdll/ldr.h>
//#define NDEBUG
#include <ntdll/ntdll.h>
/* FUNCTIONS *****************************************************************/
static NTSTATUS LdrLoadDll(PDLL* Dll, PCHAR Name)
{
char fqname[255] = "\\??\\C:\\reactos\\system\\";
ANSI_STRING AnsiString;
UNICODE_STRING UnicodeString;
OBJECT_ATTRIBUTES FileObjectAttributes;
char BlockBuffer[1024];
PIMAGE_DOS_HEADER DosHeader;
NTSTATUS Status;
PIMAGE_NT_HEADERS NTHeaders;
PEPFUNC DllStartupAddr;
ULONG ImageSize, InitialViewSize;
PVOID ImageBase;
HANDLE FileHandle, SectionHandle;
DPRINT("LdrLoadDll(Base %x, Name %s)\n",Dll,Name);
strcat(fqname, Name);
DPRINT("fqname %s\n",fqname);
RtlInitAnsiString(&AnsiString,fqname);
RtlAnsiStringToUnicodeString(&UnicodeString,&AnsiString,TRUE);
InitializeObjectAttributes(&FileObjectAttributes,
&UnicodeString,
0,
NULL,
NULL);
DPRINT("Opening dll\n");
Status = ZwOpenFile(&FileHandle, FILE_ALL_ACCESS, &FileObjectAttributes,
NULL, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT("Dll open failed ");
return Status;
}
Status = ZwReadFile(FileHandle, 0, 0, 0, 0, BlockBuffer, 1024, 0, 0);
if (!NT_SUCCESS(Status))
{
DPRINT("Dll header read failed ");
ZwClose(FileHandle);
return Status;
}
DosHeader = (PIMAGE_DOS_HEADER) BlockBuffer;
if (DosHeader->e_magic != IMAGE_DOS_MAGIC ||
DosHeader->e_lfanew == 0L ||
*(PULONG)((PUCHAR)BlockBuffer + DosHeader->e_lfanew) != IMAGE_PE_MAGIC)
{
DPRINT("NTDLL format invalid\n");
ZwClose(FileHandle);
return STATUS_UNSUCCESSFUL;
}
NTHeaders = (PIMAGE_NT_HEADERS)(BlockBuffer + DosHeader->e_lfanew);
ImageBase = (PVOID)NTHeaders->OptionalHeader.ImageBase;
ImageSize = NTHeaders->OptionalHeader.SizeOfImage;
DPRINT("ImageBase %x\n",ImageBase);
DllStartupAddr = (PEPFUNC)(ImageBase +
NTHeaders->OptionalHeader.AddressOfEntryPoint);
/* Create a section for NTDLL */
Status = ZwCreateSection(&SectionHandle,
SECTION_ALL_ACCESS,
NULL,
NULL,
PAGE_READWRITE,
MEM_COMMIT,
FileHandle);
if (!NT_SUCCESS(Status))
{
DPRINT("NTDLL create section failed ");
ZwClose(FileHandle);
return Status;
}
/* Map the NTDLL into the process */
InitialViewSize = DosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)
+ sizeof(IMAGE_SECTION_HEADER) * NTHeaders->FileHeader.NumberOfSections;
Status = ZwMapViewOfSection(SectionHandle,
NtCurrentProcess(),
(PVOID *)&ImageBase,
0,
InitialViewSize,
NULL,
&InitialViewSize,
0,
MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
DPRINT("NTDLL map view of secion failed ");
ZwClose(FileHandle);
return Status;
}
ZwClose(FileHandle);
(*Dll) = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(DLL));
(*Dll)->Headers = NTHeaders;
(*Dll)->BaseAddress = (PVOID)ImageBase;
(*Dll)->Next = LdrDllListHead.Next;
(*Dll)->Prev = &LdrDllListHead;
LdrDllListHead.Next->Prev = (*Dll);
LdrDllListHead.Next = (*Dll);
LdrPEStartup(ImageBase, SectionHandle);
return(STATUS_SUCCESS);
}
static NTSTATUS LdrFindDll(PDLL* Dll, PCHAR Name)
{
PIMAGE_EXPORT_DIRECTORY ExportDir;
DLL* current;
PIMAGE_OPTIONAL_HEADER OptionalHeader;
DPRINT("LdrFindDll(Name %s)\n",Name);
current = &LdrDllListHead;
do
{
OptionalHeader = &current->Headers->OptionalHeader;
ExportDir = (PIMAGE_EXPORT_DIRECTORY)OptionalHeader->DataDirectory[
IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
ExportDir = (PIMAGE_EXPORT_DIRECTORY)
((ULONG)ExportDir + (ULONG)current->BaseAddress);
DPRINT("Scanning %x %x %x\n", ExportDir->Name,
current->BaseAddress, ExportDir->Name + current->BaseAddress);
DPRINT("Scanning %s\n", ExportDir->Name + current->BaseAddress);
if (strcmp(ExportDir->Name + current->BaseAddress, Name) == 0)
{
*Dll = current;
return(STATUS_SUCCESS);
}
current = current->Next;
} while (current != &LdrDllListHead);
DPRINT("Failed to find dll %s\n",Name);
return(LdrLoadDll(Dll, Name));
}
static NTSTATUS LdrMapSections(PVOID ImageBase,
HANDLE SectionHandle,
PIMAGE_NT_HEADERS NTHeaders)
{
ULONG i;
NTSTATUS Status;
for (i=0; i<NTHeaders->FileHeader.NumberOfSections; i++)
{
PIMAGE_SECTION_HEADER Sections;
LARGE_INTEGER Offset;
ULONG Base;
Sections = (PIMAGE_SECTION_HEADER)SECHDROFFSET(ImageBase);
Base = (ULONG)(Sections[i].VirtualAddress + ImageBase);
SET_LARGE_INTEGER_HIGH_PART(Offset,0);
SET_LARGE_INTEGER_LOW_PART(Offset,Sections[i].PointerToRawData);
Status = ZwMapViewOfSection(SectionHandle,
NtCurrentProcess(),
(PVOID *)&Base,
0,
Sections[i].Misc.VirtualSize,
&Offset,
(PULONG)&Sections[i].Misc.VirtualSize,
0,
MEM_COMMIT,
PAGE_READWRITE);
if (!NT_SUCCESS(Status))
{
return Status;
}
}
return(STATUS_SUCCESS);
}
static PVOID LdrGetExportByOrdinal(PDLL Module, ULONG Ordinal)
{
PIMAGE_EXPORT_DIRECTORY ExportDir;
PDWORD* ExFunctions;
USHORT* ExOrdinals;
ExportDir = (Module->BaseAddress +
(Module->Headers->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
ExOrdinals = (USHORT*)RVA(Module->BaseAddress,
ExportDir->AddressOfNameOrdinals);
ExFunctions = (PDWORD*)RVA(Module->BaseAddress,
ExportDir->AddressOfFunctions);
return(ExFunctions[ExOrdinals[Ordinal - ExportDir->Base]]);
}
static PVOID LdrGetExportByName(PDLL Module, PUCHAR SymbolName)
{
PIMAGE_EXPORT_DIRECTORY ExportDir;
PDWORD* ExFunctions;
PDWORD* ExNames;
USHORT* ExOrdinals;
ULONG i;
PVOID ExName;
ULONG Ordinal;
DPRINT("LdrFindExport(Module %x, SymbolName %s)\n",
Module, SymbolName);
ExportDir = (Module->BaseAddress +
(Module->Headers->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress));
/* Get header pointers */
ExNames = (PDWORD*)RVA(Module->BaseAddress, ExportDir->AddressOfNames);
ExOrdinals = (USHORT*)RVA(Module->BaseAddress,
ExportDir->AddressOfNameOrdinals);
ExFunctions = (PDWORD*)RVA(Module->BaseAddress,
ExportDir->AddressOfFunctions);
for (i=0; i<ExportDir->NumberOfFunctions; i++)
{
ExName = RVA(Module->BaseAddress, ExNames[i]);
if (strcmp(ExName,SymbolName) == 0)
{
Ordinal = ExOrdinals[i];
return(RVA(Module->BaseAddress, ExFunctions[Ordinal]));
}
}
return(NULL);
}
static NTSTATUS LdrPerformRelocations(PIMAGE_NT_HEADERS NTHeaders,
PVOID ImageBase)
{
USHORT NumberOfEntries;
PUSHORT pValue16;
ULONG RelocationRVA;
ULONG Delta32, Offset;
PULONG pValue32;
PRELOCATION_DIRECTORY RelocationDir;
PRELOCATION_ENTRY RelocationBlock;
int i;
RelocationRVA = NTHeaders->OptionalHeader.DataDirectory[
IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
if (RelocationRVA)
{
RelocationDir = (PRELOCATION_DIRECTORY)((PCHAR)ImageBase +
RelocationRVA);
while (RelocationDir->SizeOfBlock)
{
Delta32 = (unsigned long)(ImageBase -
NTHeaders->OptionalHeader.ImageBase);
RelocationBlock = (PRELOCATION_ENTRY)
(RelocationRVA + ImageBase + sizeof(RELOCATION_DIRECTORY));
NumberOfEntries =
(RelocationDir->SizeOfBlock - sizeof(RELOCATION_DIRECTORY)) /
sizeof(RELOCATION_ENTRY);
for (i = 0; i < NumberOfEntries; i++)
{
Offset = (RelocationBlock[i].TypeOffset & 0xfff) +
RelocationDir->VirtualAddress;
switch (RelocationBlock[i].TypeOffset >> 12)
{
case TYPE_RELOC_ABSOLUTE:
break;
case TYPE_RELOC_HIGH:
pValue16 = (PUSHORT) (ImageBase + Offset);
*pValue16 += Delta32 >> 16;
break;
case TYPE_RELOC_LOW:
pValue16 = (PUSHORT)(ImageBase + Offset);
*pValue16 += Delta32 & 0xffff;
break;
case TYPE_RELOC_HIGHLOW:
pValue32 = (PULONG) (ImageBase + Offset);
*pValue32 += Delta32;
break;
case TYPE_RELOC_HIGHADJ:
/* FIXME: do the highadjust fixup */
DPRINT("TYPE_RELOC_HIGHADJ fixup not implemented"
", sorry\n");
return(STATUS_UNSUCCESSFUL);
default:
DPRINT("unexpected fixup type\n");
return(STATUS_UNSUCCESSFUL);
}
}
RelocationRVA += RelocationDir->SizeOfBlock;
RelocationDir = (PRELOCATION_DIRECTORY)(ImageBase +
RelocationRVA);
}
}
return(STATUS_SUCCESS);
}
static NTSTATUS LdrFixupImports(PIMAGE_NT_HEADERS NTHeaders,
PVOID ImageBase)
{
PIMAGE_IMPORT_MODULE_DIRECTORY ImportModuleDirectory;
ULONG Ordinal;
PDLL Module;
NTSTATUS Status;
/* Process each import module */
ImportModuleDirectory = (PIMAGE_IMPORT_MODULE_DIRECTORY)
(ImageBase + NTHeaders->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (ImportModuleDirectory->dwRVAModuleName)
{
PVOID *ImportAddressList;
PULONG FunctionNameList;
DWORD pName;
PWORD pHint;
Status = LdrFindDll(&Module,
(PCHAR)(ImageBase +
ImportModuleDirectory->dwRVAModuleName));
if (!NT_SUCCESS(Status))
{
return 0;
}
/* Get the import address list */
ImportAddressList = (PVOID *)
(NTHeaders->OptionalHeader.ImageBase +
ImportModuleDirectory->dwRVAFunctionAddressList);
/* Get the list of functions to import */
if (ImportModuleDirectory->dwRVAFunctionNameList != 0)
{
FunctionNameList = (PULONG) (ImageBase +
ImportModuleDirectory->dwRVAFunctionNameList);
}
else
{
FunctionNameList = (PULONG) (ImageBase +
ImportModuleDirectory->dwRVAFunctionAddressList);
}
/* Walk through function list and fixup addresses */
while(*FunctionNameList != 0L)
{
if ((*FunctionNameList) & 0x80000000)
{
Ordinal = (*FunctionNameList) & 0x7fffffff;
*ImportAddressList = LdrGetExportByOrdinal(Module, Ordinal);
}
else
{
pName = (DWORD)(ImageBase + *FunctionNameList + 2);
pHint = (PWORD)(ImageBase + *FunctionNameList);
*ImportAddressList = LdrGetExportByName(Module,
(PUCHAR)pName);
if ((*ImportAddressList) == NULL)
{
return(STATUS_UNSUCCESSFUL);
}
}
ImportAddressList++;
FunctionNameList++;
}
ImportModuleDirectory++;
}
return(STATUS_SUCCESS);
}
PEPFUNC LdrPEStartup(PVOID ImageBase, HANDLE SectionHandle)
{
NTSTATUS Status;
PEPFUNC EntryPoint;
PIMAGE_DOS_HEADER DosHeader;
PIMAGE_NT_HEADERS NTHeaders;
DosHeader = (PIMAGE_DOS_HEADER) ImageBase;
NTHeaders = (PIMAGE_NT_HEADERS)(ImageBase + DosHeader->e_lfanew);
/* Initialize Image sections */
LdrMapSections(ImageBase, SectionHandle, NTHeaders);
if (ImageBase != (PVOID)NTHeaders->OptionalHeader.ImageBase)
{
Status = LdrPerformRelocations(NTHeaders, ImageBase);
if (!NT_SUCCESS(Status))
{
return(NULL);
}
}
if (NTHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].
VirtualAddress != 0)
{
Status = LdrFixupImports(NTHeaders, ImageBase);
if (!NT_SUCCESS(Status))
{
return(NULL);
}
}
EntryPoint = (PEPFUNC)(ImageBase +
NTHeaders->OptionalHeader.AddressOfEntryPoint);
return(EntryPoint);
}

View file

@ -1,6 +1,14 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/ntdll/main/dllmain.c
* PURPOSE:
* PROGRAMMER:
*/
#include <windows.h> #include <windows.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h>
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <ntdll/ntdll.h> #include <ntdll/ntdll.h>

View file

@ -19,7 +19,7 @@ OBJECTS = napi.o ldr/startup.o rtl/largeint.o rtl/namespc.o rtl/unicode.o \
string/strcat.o string/strcmp.o string/strcpy.o string/stricmp.o \ string/strcat.o string/strcmp.o string/strcpy.o string/stricmp.o \
string/strlen.o string/strncmp.o string/strncpy.o string/strnlen.o \ string/strlen.o string/strncmp.o string/strncpy.o string/strnlen.o \
string/strrchr.o string/wstring.o stubs/stubs.o rtl/heap.o \ string/strrchr.o string/wstring.o stubs/stubs.o rtl/heap.o \
rtl/critical.o rtl/mem.o rtl/critical.o rtl/mem.o ldr/utils.o
ntdll.a: $(OBJECTS) ntdll.a: $(OBJECTS)
$(AR) csr ntdll.a $(OBJECTS) $(AR) csr ntdll.a $(OBJECTS)
@ -43,4 +43,5 @@ ntdll.dll: $(DLLMAIN) $(OBJECTS)
- $(RM) temp.exp - $(RM) temp.exp
$(NM) --numeric-sort ntdll.dll > ntdll.sym $(NM) --numeric-sort ntdll.dll > ntdll.sym
#WARNINGS_ARE_ERRORS = yes
include ../../rules.mak include ../../rules.mak

View file

@ -10,6 +10,9 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#include <windows.h> #include <windows.h>
#include <ntdll/rtl.h>
#include <ntdll/ntdll.h>
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
@ -37,5 +40,7 @@ VOID RtlLeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
WINBOOL RtlTryEntryCriticalSection(LPCRITICAL_SECTION lpCriticalSection) WINBOOL RtlTryEntryCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
{ {
UNIMPLEMENTED;
for(;;);
} }

View file

@ -28,6 +28,7 @@
#include <string.h> #include <string.h>
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <ntdll/rtl.h>
#define NDEBUG #define NDEBUG
#include <ntdll/ntdll.h> #include <ntdll/ntdll.h>
@ -656,7 +657,7 @@ PHEAP __HeapPrepare(LPVOID base, ULONG minsize, ULONG maxsize, ULONG flags)
* Called by __VirtualInit to initialize the default process heap * * Called by __VirtualInit to initialize the default process heap *
*********************************************************************/ *********************************************************************/
VOID WINAPI __RtlInitHeap(LPVOID base, ULONG minsize, ULONG maxsize) VOID WINAPI __RtlInitHeap(PVOID base, ULONG minsize, ULONG maxsize)
{ {
NTSTATUS Result; NTSTATUS Result;
PHEAP NewHeap; PHEAP NewHeap;
@ -952,7 +953,7 @@ UINT RtlCompactHeap(HANDLE hheap, DWORD flags)
/********************************************************************* /*********************************************************************
* HeapSize -- KERNEL32 * * HeapSize -- KERNEL32 *
*********************************************************************/ *********************************************************************/
DWORD WINAPI RtlSizeHeap(HANDLE hheap, DWORD flags, LPCVOID pmem) DWORD WINAPI RtlSizeHeap(HANDLE hheap, DWORD flags, PVOID pmem)
{ {
PHEAP pheap=(PHEAP) hheap; PHEAP pheap=(PHEAP) hheap;
PHEAP_BLOCK palloc=((PHEAP_BLOCK)pmem-1); PHEAP_BLOCK palloc=((PHEAP_BLOCK)pmem-1);
@ -992,7 +993,7 @@ DWORD WINAPI RtlSizeHeap(HANDLE hheap, DWORD flags, LPCVOID pmem)
* * * *
* NOTE: only implemented in NT * * NOTE: only implemented in NT *
*********************************************************************/ *********************************************************************/
BOOL WINAPI RtlValidateHeap(HANDLE hheap, DWORD flags, LPCVOID pmem) BOOL WINAPI RtlValidateHeap(HANDLE hheap, DWORD flags, PVOID pmem)
{ {
PHEAP pheap=(PHEAP)hheap; PHEAP pheap=(PHEAP)hheap;
PHEAP_BLOCK pcheck; PHEAP_BLOCK pcheck;

View file

@ -48,7 +48,7 @@ VOID RtlCopyBytes(PVOID Destination,
RtlCopyMemory(Destination,Source,Length); RtlCopyMemory(Destination,Source,Length);
} }
VOID RtlCopyMemory(VOID* Destination, VOID* Source, ULONG Length) VOID RtlCopyMemory(VOID* Destination, CONST VOID* Source, ULONG Length)
{ {
DPRINT("RtlCopyMemory(Destination %x Source %x Length %d\n", DPRINT("RtlCopyMemory(Destination %x Source %x Length %d\n",
Destination,Source,Length); Destination,Source,Length);

View file

@ -9,20 +9,18 @@
*/ */
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
#define Aa_Difference ('A'-'a') #define Aa_Difference ('A'-'a')
PUNICODE_STRING RtlDuplicateUnicodeString(PUNICODE_STRING Dest, extern unsigned long simple_strtoul(const char *cp,
PUNICODE_STRING Src) char **endp,
{ unsigned int base);
if (Dest==NULL)
{
// Dest=ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING));
}
}
WCHAR wtoupper(WCHAR c) WCHAR wtoupper(WCHAR c)
{ {
@ -120,8 +118,9 @@ NTSTATUS RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination,
NTSTATUS RtlCharToInteger(IN PCSZ String, IN ULONG Base, IN OUT PULONG Value) NTSTATUS RtlCharToInteger(IN PCSZ String, IN ULONG Base, IN OUT PULONG Value)
{ {
*Value=simple_strtoul((const char *)String, NULL, Base); *Value = simple_strtoul((const char *)String, NULL, Base);
}; return(STATUS_SUCCESS);
}
LONG RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInsensitive) LONG RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInsensitive)
{ {
@ -339,26 +338,27 @@ VOID RtlInitString(IN OUT PSTRING DestinationString,
DestinationString->Length=strlen((char *)SourceString); DestinationString->Length=strlen((char *)SourceString);
DestinationString->MaximumLength=strlen((char *)SourceString)+1; DestinationString->MaximumLength=strlen((char *)SourceString)+1;
DestinationString->Buffer=SourceString; DestinationString->Buffer=SourceString;
}; }
VOID RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString, VOID RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString) IN PCWSTR SourceString)
{ {
unsigned long i, DestSize; unsigned long DestSize;
UNICODE_STRING Dest=*DestinationString;
if(SourceString==NULL) { if (SourceString == NULL)
DestinationString->Length=0; {
DestinationString->MaximumLength=0; DestinationString->Length = 0;
DestinationString->Buffer=NULL; DestinationString->MaximumLength = 0;
} else { DestinationString->Buffer = NULL;
DestSize=wcslen((PWSTR)SourceString); }
DestinationString->Length=DestSize; else
DestinationString->MaximumLength=DestSize+1; {
DestSize = wcslen((PWSTR)SourceString);
DestinationString->Buffer=(PWSTR)SourceString; DestinationString->Length = DestSize;
}; DestinationString->MaximumLength = DestSize+1;
}; DestinationString->Buffer = (PWSTR)SourceString;
}
}
NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base, /* optional */ NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base, /* optional */
IN OUT PUNICODE_STRING String) IN OUT PUNICODE_STRING String)
@ -366,17 +366,17 @@ NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base,
char *str; char *str;
unsigned long len, i; unsigned long len, i;
// str=ExAllocatePool(NonPagedPool, 1024); str = RtlAllocateHeap(RtlGetProcessHeap, 0, 1024);
if(Base==16) { if(Base==16) {
sprintf(str, "%x", Value); sprintf(str, "%x", (unsigned int)Value);
} else } else
if(Base==8) { if(Base==8) {
sprintf(str, "%o", Value); sprintf(str, "%o", (unsigned int)Value);
} else } else
if(Base==2) { if(Base==2) {
sprintf(str, "%b", Value); // sprintf(str, "%b", Value);
} else { } else {
sprintf(str, "%u", Value); sprintf(str, "%u", (unsigned int)Value);
}; };
len=strlen(str); len=strlen(str);
@ -394,7 +394,7 @@ NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base,
// ExFreePool(str); // ExFreePool(str);
return STATUS_SUCCESS; return STATUS_SUCCESS;
}; }
NTSTATUS RtlUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString, NTSTATUS RtlUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString,
IN PUNICODE_STRING SourceString, IN PUNICODE_STRING SourceString,
@ -431,9 +431,10 @@ NTSTATUS RtlUnicodeStringToInteger(IN PUNICODE_STRING String, IN ULONG Base,
unsigned long i, lenmin=0; unsigned long i, lenmin=0;
BOOLEAN addneg=FALSE; BOOLEAN addneg=FALSE;
// str=ExAllocatePool(NonPagedPool, String->Length+1); str=RtlAllocateHeap(RtlGetProcessHeap(), 0, String->Length+1);
for(i=0; i<String->Length; i++) { for(i=0; i<String->Length; i++)
{
*str=*String->Buffer; *str=*String->Buffer;
if(*str=='b') { Base=2; lenmin++; } else if(*str=='b') { Base=2; lenmin++; } else
@ -478,8 +479,9 @@ NTSTATUS RtlUnicodeStringToInteger(IN PUNICODE_STRING String, IN ULONG Base,
} else } else
*Value=simple_strtoul(str, NULL, Base); *Value=simple_strtoul(str, NULL, Base);
// ExFreePool(str); // ExFreePool(str);
}; return(STATUS_SUCCESS);
}
NTSTATUS RtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString, NTSTATUS RtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString, IN PUNICODE_STRING SourceString,

View file

@ -16,9 +16,12 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#include <string.h>
#include <internal/debug.h> #include <internal/debug.h>
extern size_t strnlen(const char* string, size_t maxlen);
unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base) unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base)
{ {
unsigned long result = 0,value; unsigned long result = 0,value;
@ -70,8 +73,8 @@ __res = ((unsigned long) n) % (unsigned) base; \
n = ((unsigned long) n) / (unsigned) base; \ n = ((unsigned long) n) / (unsigned) base; \
__res; }) __res; })
static char * number(char * str, long num, int base, int size, int precision static char * number(char * str, long num, int base, int size, int precision,
,int type) int type)
{ {
char c,sign,tmp[66]; char c,sign,tmp[66];
const char *digits="0123456789abcdefghijklmnopqrstuvwxyz"; const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
@ -83,27 +86,38 @@ static char * number(char * str, long num, int base, int size, int precision
type &= ~ZEROPAD; type &= ~ZEROPAD;
if (base < 2 || base > 36) if (base < 2 || base > 36)
return 0; return 0;
c = (type & ZEROPAD) ? '0' : ' '; c = (type & ZEROPAD) ? '0' : ' ';
sign = 0; sign = 0;
if (type & SIGN) {
if (num < 0) { if (type & SIGN)
{
if (num < 0)
{
sign = '-'; sign = '-';
num = -num; num = -num;
size--; size--;
} else if (type & PLUS) { }
else if (type & PLUS)
{
sign = '+'; sign = '+';
size--; size--;
} else if (type & SPACE) { }
else if (type & SPACE)
{
sign = ' '; sign = ' ';
size--; size--;
} }
} }
if (type & SPECIAL) {
if (type & SPECIAL)
{
if (base == 16) if (base == 16)
size -= 2; size -= 2;
else if (base == 8) else if (base == 8)
size--; size--;
} }
i = 0; i = 0;
if (num == 0) if (num == 0)
tmp[i++]='0'; tmp[i++]='0';
@ -118,12 +132,17 @@ static char * number(char * str, long num, int base, int size, int precision
if (sign) if (sign)
*str++ = sign; *str++ = sign;
if (type & SPECIAL) if (type & SPECIAL)
{
if (base==8) if (base==8)
{
*str++ = '0'; *str++ = '0';
else if (base==16) { }
else if (base==16)
{
*str++ = '0'; *str++ = '0';
*str++ = digits[33]; *str++ = digits[33];
} }
}
if (!(type & LEFT)) if (!(type & LEFT))
while (size-- > 0) while (size-- > 0)
*str++ = c; *str++ = c;
@ -351,6 +370,7 @@ int wsprintfA(char * buf, const char *fmt, ...)
return i; return i;
} }
#if 0
int wsprintfW(unsigned short * buf, const unsigned short *fmt, ...) int wsprintfW(unsigned short * buf, const unsigned short *fmt, ...)
{ {
va_list args; va_list args;
@ -361,7 +381,7 @@ int wsprintfW(unsigned short * buf, const unsigned short *fmt, ...)
va_end(args); va_end(args);
return i; return i;
} }
#endif
unsigned short towupper(unsigned short w) unsigned short towupper(unsigned short w)
{ {

View file

@ -14,15 +14,17 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <wchar.h> #include <wchar.h>
static wchar_t * ___wcstok = NULL; /* GLOBALS *******************************************************************/
// static wchar_t * ___wcstok = NULL;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
int wcsicmp(const wchar_t* ws1, const wchar_t* ws2) int wcsnicmp(const wchar_t* ws1, const wchar_t* ws2, size_t size)
{ {
} }
int wcsnicmp(const wchar_t* ws1, const wchar_t* ws2, size_t size) int wcsicmp(const wchar_t* ws1, const wchar_t* ws2)
{ {
} }
@ -41,14 +43,13 @@ wchar_t* wcscat(wchar_t *dest, const wchar_t *src)
return dest; return dest;
} }
wchar_t * wchar_t* wcschr(const wchar_t *str, wchar_t ch)
wcschr(const wchar_t *str, wchar_t ch)
{ {
while ((*str) != ((wchar_t) 0)) while ((*str) != ((wchar_t) 0))
{ {
if ((*str) == ch) if ((*str) == ch)
{ {
return str; return (wchar_t *)str;
} }
str++; str++;
} }
@ -56,8 +57,7 @@ wcschr(const wchar_t *str, wchar_t ch)
return NULL; return NULL;
} }
int int wcscmp(const wchar_t *cs, const wchar_t *ct)
wcscmp(const wchar_t *cs, const wchar_t *ct)
{ {
while (*cs != '\0' && *ct != '\0' && *cs == *ct) while (*cs != '\0' && *ct != '\0' && *cs == *ct)
{ {

View file

@ -62,7 +62,6 @@ STUB(PfxInitialize)
STUB(PfxInsertPrefix) STUB(PfxInsertPrefix)
STUB(PfxRemovePrefix) STUB(PfxRemovePrefix)
STUB(RestoreEm87Context) STUB(RestoreEm87Context)
STUB(RtlValidateHeap)
STUB(RtlValidateProcessHeaps) STUB(RtlValidateProcessHeaps)
STUB(RtlWalkHeap) STUB(RtlWalkHeap)
STUB(RtlZeroHeap) STUB(RtlZeroHeap)

View file

@ -14,7 +14,7 @@ include rules.mak
# #
# Required to run the system # Required to run the system
# #
COMPONENTS = iface_native ntoskrnl kernel32 ntdll COMPONENTS = iface_native ntoskrnl ntdll kernel32
# #
# Select the server(s) you want to build # Select the server(s) you want to build

View file

@ -25,6 +25,7 @@ static ULONG CbHash(PDCCB Dccb, ULONG BlockNr)
return(BlockNr % Dccb->HashTblSize); return(BlockNr % Dccb->HashTblSize);
} }
#if 0
static VOID CbDereferenceCcb(PDCCB Dccb, PCCB Ccb) static VOID CbDereferenceCcb(PDCCB Dccb, PCCB Ccb)
{ {
KIRQL oldlvl; KIRQL oldlvl;
@ -33,6 +34,7 @@ static VOID CbDereferenceCcb(PDCCB Dccb, PCCB Ccb)
Ccb->References--; Ccb->References--;
KeReleaseSpinLock(&Dccb->HashTblLock,oldlvl); KeReleaseSpinLock(&Dccb->HashTblLock,oldlvl);
} }
#endif
static PCCB CbGetCcbFromHashTable(PDCCB Dccb, ULONG BlockNr) static PCCB CbGetCcbFromHashTable(PDCCB Dccb, ULONG BlockNr)
{ {
@ -49,6 +51,7 @@ static PCCB CbGetCcbFromHashTable(PDCCB Dccb, ULONG BlockNr)
return(Ccb); return(Ccb);
} }
#if 0
static BOOLEAN CbRemoveCcbFromHashTable(PDCCB Dccb, PCCB Ccb) static BOOLEAN CbRemoveCcbFromHashTable(PDCCB Dccb, PCCB Ccb)
{ {
KIRQL oldlvl; KIRQL oldlvl;
@ -67,7 +70,7 @@ static BOOLEAN CbRemoveCcbFromHashTable(PDCCB Dccb, PCCB Ccb)
KeReleaseSpinLock(&Dccb->HashTblLock,oldlvl); KeReleaseSpinLock(&Dccb->HashTblLock,oldlvl);
return(Status); return(Status);
} }
#endif
static BOOLEAN CbLockForWrite(PCCB Ccb) static BOOLEAN CbLockForWrite(PCCB Ccb)
{ {
@ -126,11 +129,13 @@ static BOOLEAN CbLockForDelete(PDCCB Dccb, PCCB Ccb)
return(TRUE); return(TRUE);
} }
#if 0
static VOID CbUnlockForDelete(PDCCB Dccb, PCCB Ccb) static VOID CbUnlockForDelete(PDCCB Dccb, PCCB Ccb)
{ {
Ccb->ActiveWriter = FALSE; Ccb->ActiveWriter = FALSE;
KeSetEvent(&Ccb->FinishedNotify,IO_NO_INCREMENT,FALSE); KeSetEvent(&Ccb->FinishedNotify,IO_NO_INCREMENT,FALSE);
} }
#endif
VOID CbAcquireForDelete(PDCCB Dccb, PCCB Ccb) VOID CbAcquireForDelete(PDCCB Dccb, PCCB Ccb)
/* /*
@ -234,6 +239,7 @@ PCCB CbFindModifiedCcb(PDCCB Dccb, PCCB Start)
UNIMPLEMENTED; UNIMPLEMENTED;
} }
#if 0
static VOID CbDeleteAllCcbs(PDCCB Dccb) static VOID CbDeleteAllCcbs(PDCCB Dccb)
/* /*
* FUNCTION: Delete all the ccbs associated with a dccb * FUNCTION: Delete all the ccbs associated with a dccb
@ -261,7 +267,9 @@ static VOID CbDeleteAllCcbs(PDCCB Dccb)
ExFreePool(Ccb); ExFreePool(Ccb);
} }
} }
#endif
#if 0
static VOID CbFreeCcb(PDCCB Dccb, PCCB Ccb) static VOID CbFreeCcb(PDCCB Dccb, PCCB Ccb)
{ {
KIRQL oldlvl; KIRQL oldlvl;
@ -279,7 +287,9 @@ static VOID CbFreeCcb(PDCCB Dccb, PCCB Ccb)
KeReleaseSpinLock(&Dccb->CcbListLock,oldlvl); KeReleaseSpinLock(&Dccb->CcbListLock,oldlvl);
ExFreePool(Ccb); ExFreePool(Ccb);
} }
#endif
#if 0
static VOID CbReclaimMemory(PDCCB Dccb) static VOID CbReclaimMemory(PDCCB Dccb)
{ {
PCCB RedundantCcbs[25]; PCCB RedundantCcbs[25];
@ -323,7 +333,9 @@ static VOID CbReclaimMemory(PDCCB Dccb)
CbFreeCcb(Dccb,RedundantCcbs[i]); CbFreeCcb(Dccb,RedundantCcbs[i]);
} }
} }
#endif
#if 0
static VOID CbDeleteCcb(PDCCB Dccb, PCCB Ccb) static VOID CbDeleteCcb(PDCCB Dccb, PCCB Ccb)
/* /*
* FUNCTION: Deletes a CCB * FUNCTION: Deletes a CCB
@ -338,6 +350,7 @@ static VOID CbDeleteCcb(PDCCB Dccb, PCCB Ccb)
CbAcquireForDelete(Dccb,Ccb); CbAcquireForDelete(Dccb,Ccb);
Ccb->State = CCB_DELETE_PENDING; Ccb->State = CCB_DELETE_PENDING;
} }
#endif
VOID CbReinitCcb(PDCCB Dccb, PCCB Ccb, ULONG BlockNr) VOID CbReinitCcb(PDCCB Dccb, PCCB Ccb, ULONG BlockNr)
{ {

View file

@ -273,6 +273,7 @@ ZwCreateKey(PHANDLE KeyHandle,
NTSTATUS NtDeleteKey(HANDLE KeyHandle) NTSTATUS NtDeleteKey(HANDLE KeyHandle)
{ {
return(ZwDeleteKey(KeyHandle));
} }
NTSTATUS ZwDeleteKey(HANDLE KeyHandle) NTSTATUS ZwDeleteKey(HANDLE KeyHandle)
@ -280,15 +281,23 @@ NTSTATUS ZwDeleteKey(HANDLE KeyHandle)
UNIMPLEMENTED; UNIMPLEMENTED;
} }
NTSTATUS NtEnumerateKey(HANDLE KeyHandle, ULONG Index, NTSTATUS NtEnumerateKey(HANDLE KeyHandle,
ULONG Index,
KEY_INFORMATION_CLASS KeyInformationClass, KEY_INFORMATION_CLASS KeyInformationClass,
PVOID KeyInformation, PVOID KeyInformation,
ULONG Length, ULONG Length,
PULONG ResultLength) PULONG ResultLength)
{ {
return(ZwEnumerateKey(KeyHandle,
Index,
KeyInformationClass,
KeyInformation,
Length,
ResultLength));
} }
NTSTATUS ZwEnumerateKey(HANDLE KeyHandle, ULONG Index, NTSTATUS ZwEnumerateKey(HANDLE KeyHandle,
ULONG Index,
KEY_INFORMATION_CLASS KeyInformationClass, KEY_INFORMATION_CLASS KeyInformationClass,
PVOID KeyInformation, PVOID KeyInformation,
ULONG Length, ULONG Length,

View file

@ -61,7 +61,7 @@ VOID ExReleaseFastMutex(PFAST_MUTEX FastMutex)
BOOLEAN ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex) BOOLEAN ExTryToAcquireFastMutex(PFAST_MUTEX FastMutex)
{ {
InterlockedCompareExchange(&(FastMutex->Count),0,0); UNIMPLEMENTED;
} }

View file

@ -73,6 +73,7 @@ ULONG ExGetSharedWaiterCount(PERESOURCE Resource)
NTSTATUS ExInitializeResource(PERESOURCE Resource) NTSTATUS ExInitializeResource(PERESOURCE Resource)
{ {
UNIMPLEMENTED;
} }
NTSTATUS ExInitializeResourceLite(PERESOURCE Resource) NTSTATUS ExInitializeResourceLite(PERESOURCE Resource)
@ -81,10 +82,17 @@ NTSTATUS ExInitializeResourceLite(PERESOURCE Resource)
Resource->NumberOfExclusiveWaiters = 0; Resource->NumberOfExclusiveWaiters = 0;
KeInitializeSpinLock(&Resource->SpinLock); KeInitializeSpinLock(&Resource->SpinLock);
Resource->Flag=0; Resource->Flag=0;
KeInitializeEvent(&Resource->ExclusiveWaiters,SynchronizationEvent, Resource->ExclusiveWaiters = ExAllocatePool(NonPagedPool,
sizeof(KEVENT));
KeInitializeEvent(Resource->ExclusiveWaiters,
SynchronizationEvent,
FALSE); FALSE);
KeInitializeSemaphore(&Resource->SharedWaiters,5,0); Resource->SharedWaiters = ExAllocatePool(NonPagedPool,
sizeof(KSEMAPHORE));
KeInitializeSemaphore(Resource->SharedWaiters,5,0);
Resource->ActiveCount = 0; Resource->ActiveCount = 0;
return(STATUS_SUCCESS);
} }
BOOLEAN ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource) BOOLEAN ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource)

View file

@ -45,7 +45,7 @@ typedef struct
/* /*
* PURPOSE: Queue of items waiting to be processed at normal priority * PURPOSE: Queue of items waiting to be processed at normal priority
*/ */
WORK_QUEUE normal_work_queue = {0,}; WORK_QUEUE normal_work_queue = {{0,}};
#define WAIT_INTERVAL (0) #define WAIT_INTERVAL (0)

View file

@ -27,8 +27,8 @@ ExAllocateFromNPagedLookasideList
ExAllocateFromPagedLookasideList ExAllocateFromPagedLookasideList
ExAllocateFromZone ExAllocateFromZone
ExAllocatePool ExAllocatePool
ExAllocatePoolWithQuota #ExAllocatePoolWithQuota
ExAllocatePoolWithQuotaTag #ExAllocatePoolWithQuotaTag
ExAllocatePoolWithTag ExAllocatePoolWithTag
ExConvertExclusiveToSharedLite ExConvertExclusiveToSharedLite
ExDeleteNPagedLookasideList ExDeleteNPagedLookasideList
@ -88,11 +88,11 @@ InterlockedCompareExchange
InterlockedExchange InterlockedExchange
InterlockedExchangeAdd InterlockedExchangeAdd
InterlockedIncrement InterlockedIncrement
HalAllocateCommonBuffer #HalAllocateCommonBuffer
HalAssignSlotResources HalAssignSlotResources
HalExamineMBR HalExamineMBR
HalFreeCommonBuffer #HalFreeCommonBuffer
HalGetAdapter #HalGetAdapter
HalGetBusData HalGetBusData
HalGetBusDataByOffset HalGetBusDataByOffset
HalGetDmaAlignmentRequirement HalGetDmaAlignmentRequirement
@ -319,7 +319,7 @@ RtlFreeUnicodeString
RtlInitAnsiString RtlInitAnsiString
RtlInitString RtlInitString
RtlInitUnicodeString RtlInitUnicodeString
RtlIntegerToUnicodeString #RtlIntegerToUnicodeString
RtlLargeIntegerAdd RtlLargeIntegerAdd
RtlLargeIntegerAnd RtlLargeIntegerAnd
RtlLargeIntegerArithmeticShift RtlLargeIntegerArithmeticShift

View file

@ -50,6 +50,7 @@ ULONG HalGetDmaAlignmentRequirement()
return(1); return(1);
} }
#if 0
PVOID HalAllocateCommonBuffer(PADAPTER_OBJECT AdapterObject, PVOID HalAllocateCommonBuffer(PADAPTER_OBJECT AdapterObject,
ULONG Length, ULONG Length,
PPHYSICAL_ADDRESS LogicalAddress, PPHYSICAL_ADDRESS LogicalAddress,
@ -115,6 +116,7 @@ PADAPTER_OBJECT HalGetAdapter(PDEVICE_DESCRIPTION DeviceDescription,
RtlCopyMemory(&adapter->desc,DeviceDescription,sizeof(DEVICE_DESCRIPTION)); RtlCopyMemory(&adapter->desc,DeviceDescription,sizeof(DEVICE_DESCRIPTION));
*/ */
} }
#endif
ULONG HalReadDmaCounter(PADAPTER_OBJECT AdapterObject) ULONG HalReadDmaCounter(PADAPTER_OBJECT AdapterObject)
{ {

View file

@ -25,6 +25,7 @@ static KIRQL CurrentIrql = HIGH_LEVEL;
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
#if 0
static unsigned int HiGetCurrentPICMask(void) static unsigned int HiGetCurrentPICMask(void)
{ {
unsigned int mask; unsigned int mask;
@ -34,6 +35,7 @@ static unsigned int HiGetCurrentPICMask(void)
return mask; return mask;
} }
#endif
static unsigned int HiSetCurrentPICMask(unsigned int mask) static unsigned int HiSetCurrentPICMask(unsigned int mask)
{ {

View file

@ -124,7 +124,7 @@ PHYSICAL_ADDRESS MmGetPhysicalAddress(PVOID vaddr)
* FUNCTION: Returns the physical address corresponding to a virtual address * FUNCTION: Returns the physical address corresponding to a virtual address
*/ */
{ {
PHYSICAL_ADDRESS p; PHYSICAL_ADDRESS p = INITIALIZE_LARGE_INTEGER;
DPRINT("MmGetPhysicalAddress(vaddr %x)\n", vaddr); DPRINT("MmGetPhysicalAddress(vaddr %x)\n", vaddr);

View file

@ -13,6 +13,7 @@
#include <internal/ke.h> #include <internal/ke.h>
#include <internal/bitops.h> #include <internal/bitops.h>
#include <internal/linkage.h> #include <internal/linkage.h>
#include <string.h>
#include <internal/string.h> #include <internal/string.h>
#include <internal/i386/segment.h> #include <internal/i386/segment.h>

View file

@ -41,12 +41,12 @@ BOOLEAN IoCancelIrp(PIRP Irp)
IoAcquireCancelSpinLock(&oldlvl); IoAcquireCancelSpinLock(&oldlvl);
Irp->Cancel = TRUE; Irp->Cancel = TRUE;
if (Irp->CancelRoutine==NULL) if (Irp->CancelRoutine == NULL)
{ {
return(FALSE); return(FALSE);
} }
Irp->CancelRoutine(Irp->Stack[0].DeviceObject,Irp); Irp->CancelRoutine(Irp->Stack[0].DeviceObject, Irp);
IoReleaseCancelSpinLock(&oldlvl); IoReleaseCancelSpinLock(oldlvl);
return(TRUE); return(TRUE);
} }

View file

@ -177,7 +177,6 @@ NTSTATUS IopCreateDevice(PVOID ObjectBody,
PWSTR RemainingPath, PWSTR RemainingPath,
POBJECT_ATTRIBUTES ObjectAttributes) POBJECT_ATTRIBUTES ObjectAttributes)
{ {
PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)ObjectBody;
DPRINT("IopCreateDevice(ObjectBody %x, Parent %x, RemainingPath %w)\n", DPRINT("IopCreateDevice(ObjectBody %x, Parent %x, RemainingPath %w)\n",
ObjectBody, Parent, RemainingPath); ObjectBody, Parent, RemainingPath);

View file

@ -27,12 +27,14 @@ VOID MmUnlockPagableImageSection(PVOID ImageSectionHandle)
* MmLockPagableDataSection * MmLockPagableDataSection
*/ */
{ {
MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle); // MmUnlockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
UNIMPLEMENTED;
} }
VOID MmLockPagableSectionByHandle(PVOID ImageSectionHandle) VOID MmLockPagableSectionByHandle(PVOID ImageSectionHandle)
{ {
MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle); // MmLockMemoryArea((MEMORY_AREA *)ImageSectionHandle);
UNIMPLEMENTED;
} }
PVOID MmLockPagableCodeSection(PVOID AddressWithinSection) PVOID MmLockPagableCodeSection(PVOID AddressWithinSection)

View file

@ -17,116 +17,100 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS NTSTATUS STDCALL NtCreateIoCompletion(OUT PHANDLE CompletionPort,
STDCALL
NtCreateIoCompletion(
OUT PHANDLE CompletionPort,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG NumberOfConcurrentThreads IN ULONG NumberOfConcurrentThreads)
)
{ {
return(ZwCreateIoCompletion(CompletionPort,
DesiredAccess,
IoStatusBlock,
NumberOfConcurrentThreads));
} }
NTSTATUS NTSTATUS STDCALL ZwCreateIoCompletion(OUT PHANDLE CompletionPort,
STDCALL
ZwCreateIoCompletion(
OUT PHANDLE CompletionPort,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG NumberOfConcurrentThreads IN ULONG NumberOfConcurrentThreads)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtOpenIoCompletion(OUT PHANDLE CompletionPort,
STDCALL
NtOpenIoCompletion(
OUT PHANDLE CompetionPort,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes IN POBJECT_ATTRIBUTES ObjectAttributes)
)
{ {
return(ZwOpenIoCompletion(CompletionPort,
DesiredAccess,
ObjectAttributes));
} }
NTSTATUS NTSTATUS STDCALL ZwOpenIoCompletion(OUT PHANDLE CompetionPort,
STDCALL
ZwOpenIoCompletion(
OUT PHANDLE CompetionPort,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes IN POBJECT_ATTRIBUTES ObjectAttributes)
)
{ {
return(STATUS_SUCCESS);
} }
NTSTATUS NTSTATUS STDCALL NtQueryIoCompletion(IN HANDLE CompletionPort,
STDCALL
NtQueryIoCompletion(
IN HANDLE CompletionPort,
IN ULONG CompletionKey, IN ULONG CompletionKey,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PULONG NumberOfBytesTransferred OUT PULONG NumberOfBytesTransferred)
)
{ {
return(ZwQueryIoCompletion(CompletionPort,
return ZwQueryIoCompletion(CompletionPort,CompletionKey,IoStatusBlock,NumberOfBytesTransferred); CompletionKey,
IoStatusBlock,
NumberOfBytesTransferred));
} }
NTSTATUS NTSTATUS STDCALL ZwQueryIoCompletion(IN HANDLE CompletionPort,
STDCALL
ZwQueryIoCompletion(
IN HANDLE CompletionPort,
IN ULONG CompletionKey, IN ULONG CompletionKey,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PULONG NumberOfBytesTransferred OUT PULONG NumberOfBytesTransferred)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS
STDCALL NTSTATUS STDCALL NtRemoveIoCompletion(IN HANDLE CompletionPort,
NtRemoveIoCompletion(
IN HANDLE CompletionPort,
OUT PULONG CompletionKey, OUT PULONG CompletionKey,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PULONG CompletionStatus, OUT PULONG CompletionStatus,
PLARGE_INTEGER WaitTime PLARGE_INTEGER WaitTime)
)
{ {
return(ZwRemoveIoCompletion(CompletionPort,
CompletionKey,
IoStatusBlock,
CompletionStatus,
WaitTime));
} }
NTSTATUS NTSTATUS STDCALL ZwRemoveIoCompletion(IN HANDLE CompletionPort,
STDCALL
ZwRemoveIoCompletion(
IN HANDLE CompletionPort,
OUT PULONG CompletionKey, OUT PULONG CompletionKey,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PULONG CompletionStatus, OUT PULONG CompletionStatus,
PLARGE_INTEGER WaitTime PLARGE_INTEGER WaitTime)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtSetIoCompletion(IN HANDLE CompletionPort,
STDCALL
NtSetIoCompletion(
IN HANDLE CompletionPort,
IN ULONG CompletionKey, IN ULONG CompletionKey,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG NumberOfBytesToTransfer, IN ULONG NumberOfBytesToTransfer,
OUT PULONG NumberOfBytesTransferred OUT PULONG NumberOfBytesTransferred)
)
{ {
return(ZwSetIoCompletion(CompletionPort,
CompletionKey,
IoStatusBlock,
NumberOfBytesToTransfer,
NumberOfBytesTransferred));
} }
NTSTATUS NTSTATUS STDCALL ZwSetIoCompletion(IN HANDLE CompletionPort,
STDCALL
ZwSetIoCompletion(
IN HANDLE CompletionPort,
IN ULONG CompletionKey, IN ULONG CompletionKey,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG NumberOfBytesToTransfer, IN ULONG NumberOfBytesToTransfer,
OUT PULONG NumberOfBytesTransferred OUT PULONG NumberOfBytesTransferred)
)
{ {
UNIMPLEMENTED;
} }

View file

@ -84,7 +84,7 @@ VOID IoMarkIrpPending(PIRP Irp)
DPRINT("IoGetCurrentIrpStackLocation(Irp) %x\n", DPRINT("IoGetCurrentIrpStackLocation(Irp) %x\n",
IoGetCurrentIrpStackLocation(Irp)); IoGetCurrentIrpStackLocation(Irp));
IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED; IoGetCurrentIrpStackLocation(Irp)->Control |= SL_PENDING_RETURNED;
Irp->Tail.Overlay.Thread = KeGetCurrentThread(); Irp->Tail.Overlay.Thread = PsGetCurrentThread();
DPRINT("IoGetCurrentIrpStackLocation(Irp)->Control %x\n", DPRINT("IoGetCurrentIrpStackLocation(Irp)->Control %x\n",
IoGetCurrentIrpStackLocation(Irp)->Control); IoGetCurrentIrpStackLocation(Irp)->Control);
DPRINT("SL_PENDING_RETURNED %x\n",SL_PENDING_RETURNED); DPRINT("SL_PENDING_RETURNED %x\n",SL_PENDING_RETURNED);
@ -132,7 +132,7 @@ PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
Irp->CurrentLocation, Irp->CurrentLocation,
Irp->StackCount); Irp->StackCount);
return &Irp->Stack[Irp->CurrentLocation]; return &Irp->Stack[(ULONG)Irp->CurrentLocation];
} }
@ -202,7 +202,8 @@ PIRP IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota)
if (ChargeQuota) if (ChargeQuota)
{ {
Irp = ExAllocatePoolWithQuota(NonPagedPool,IoSizeOfIrp(StackSize)); // Irp = ExAllocatePoolWithQuota(NonPagedPool,IoSizeOfIrp(StackSize));
Irp = ExAllocatePool(NonPagedPool,IoSizeOfIrp(StackSize));
} }
else else
{ {

View file

@ -17,32 +17,33 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS NTSTATUS STDCALL NtCreateMailslotFile(OUT PHANDLE MailSlotFileHandle,
STDCALL
NtCreateMailslotFile(
OUT PHANDLE MailSlotFileHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG FileAttributes, IN ULONG FileAttributes,
IN ULONG ShareAccess, IN ULONG ShareAccess,
IN ULONG MaxMessageSize, IN ULONG MaxMessageSize,
IN PLARGE_INTEGER TimeOut IN PLARGE_INTEGER TimeOut)
)
{ {
return(ZwCreateMailslotFile(MailSlotFileHandle,
DesiredAccess,
ObjectAttributes,
IoStatusBlock,
FileAttributes,
ShareAccess,
MaxMessageSize,
TimeOut));
} }
NTSTATUS NTSTATUS STDCALL ZwCreateMailslotFile(OUT PHANDLE MailSlotFileHandle,
STDCALL
ZwCreateMailslotFile(
OUT PHANDLE MailSlotFileHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG FileAttributes, IN ULONG FileAttributes,
IN ULONG ShareAccess, IN ULONG ShareAccess,
IN ULONG MaxMessageSize, IN ULONG MaxMessageSize,
IN PLARGE_INTEGER TimeOut IN PLARGE_INTEGER TimeOut)
)
{ {
UNIMPLEMENTED;
} }

View file

@ -27,8 +27,9 @@ PMDL IoAllocateMdl(PVOID VirtualAddress,
if (ChargeQuota) if (ChargeQuota)
{ {
Mdl = ExAllocatePoolWithQuota(NonPagedPool, // Mdl = ExAllocatePoolWithQuota(NonPagedPool,
MmSizeOfMdl(VirtualAddress,Length)); // MmSizeOfMdl(VirtualAddress,Length));
Mdl = ExAllocatePool(NonPagedPool,MmSizeOfMdl(VirtualAddress,Length));
} }
else else
{ {

View file

@ -16,10 +16,7 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
NTSTATUS NTSTATUS STDCALL NtCreateNamedPipeFile(OUT PHANDLE NamedPipeFileHandle,
STDCALL
NtCreateNamedPipeFile(
OUT PHANDLE NamedPipeFileHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
@ -32,15 +29,25 @@ NtCreateNamedPipeFile(
IN ULONG MaxInstances, IN ULONG MaxInstances,
IN ULONG InBufferSize, IN ULONG InBufferSize,
IN ULONG OutBufferSize, IN ULONG OutBufferSize,
IN PLARGE_INTEGER TimeOut IN PLARGE_INTEGER TimeOut)
)
{ {
return(ZwCreateNamedPipeFile(NamedPipeFileHandle,
DesiredAccess,
ObjectAttributes,
IoStatusBlock,
FileAttributes,
ShareAccess,
OpenMode,
PipeType,
PipeRead,
PipeWait,
MaxInstances,
InBufferSize,
OutBufferSize,
TimeOut));
} }
NTSTATUS NTSTATUS STDCALL ZwCreateNamedPipeFile(OUT PHANDLE NamedPipeFileHandle,
STDCALL
ZwCreateNamedPipeFile(
OUT PHANDLE NamedPipeFileHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock, OUT PIO_STATUS_BLOCK IoStatusBlock,
@ -53,7 +60,7 @@ ZwCreateNamedPipeFile(
IN ULONG MaxInstances, IN ULONG MaxInstances,
IN ULONG InBufferSize, IN ULONG InBufferSize,
IN ULONG OutBufferSize, IN ULONG OutBufferSize,
IN PLARGE_INTEGER TimeOut IN PLARGE_INTEGER TimeOut)
)
{ {
UNIMPLEMENTED;
} }

View file

@ -31,7 +31,6 @@ VOID IoStartNextPacketByKey(PDEVICE_OBJECT DeviceObject,
{ {
PKDEVICE_QUEUE_ENTRY entry; PKDEVICE_QUEUE_ENTRY entry;
PIRP Irp; PIRP Irp;
KIRQL oldirql;
entry = KeRemoveByKeyDeviceQueue(&DeviceObject->DeviceQueue,Key); entry = KeRemoveByKeyDeviceQueue(&DeviceObject->DeviceQueue,Key);
@ -58,7 +57,6 @@ VOID IoStartNextPacket(PDEVICE_OBJECT DeviceObject, BOOLEAN Cancelable)
{ {
PKDEVICE_QUEUE_ENTRY entry; PKDEVICE_QUEUE_ENTRY entry;
PIRP Irp; PIRP Irp;
KIRQL oldirql;
DPRINT("IoStartNextPacket(DeviceObject %x, Cancelable %d)\n", DPRINT("IoStartNextPacket(DeviceObject %x, Cancelable %d)\n",
DeviceObject,Cancelable); DeviceObject,Cancelable);

View file

@ -12,6 +12,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ob.h> #include <internal/ob.h>
#include <wchar.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>

View file

@ -40,6 +40,8 @@ NTSTATUS IoAttachVpb(PDEVICE_OBJECT DeviceObject)
RtlZeroMemory(Vpb->VolumeLabel,sizeof(WCHAR)*MAXIMUM_VOLUME_LABEL_LENGTH); RtlZeroMemory(Vpb->VolumeLabel,sizeof(WCHAR)*MAXIMUM_VOLUME_LABEL_LENGTH);
DeviceObject->Vpb = Vpb; DeviceObject->Vpb = Vpb;
return(STATUS_SUCCESS);
} }
PIRP IoBuildVolumeInformationIrp(ULONG MajorFunction, PIRP IoBuildVolumeInformationIrp(ULONG MajorFunction,

View file

@ -3,7 +3,7 @@
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/bug.c * FILE: ntoskrnl/ke/bug.c
* PURPOSE: Graceful system shutdown if a bug is detected * PURPOSE: Graceful system shutdown if a bug is detected
* PROGRAMMER: David Welch (welch@mcmail.com) * PROGRAMMER: David Welch (welch@cwcom.net)
* UPDATE HISTORY: * UPDATE HISTORY:
* Created 22/05/98 * Created 22/05/98
*/ */
@ -11,6 +11,7 @@
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ke.h>
#include <internal/debug.h> #include <internal/debug.h>
@ -46,6 +47,7 @@ BOOLEAN KeRegisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
CallbackRecord->Buffer=Buffer; CallbackRecord->Buffer=Buffer;
CallbackRecord->Component=Component; CallbackRecord->Component=Component;
CallbackRecord->CallbackRoutine=CallbackRoutine; CallbackRecord->CallbackRoutine=CallbackRoutine;
return(TRUE);
} }
VOID KeBugCheckEx(ULONG BugCheckCode, VOID KeBugCheckEx(ULONG BugCheckCode,

View file

@ -12,16 +12,16 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/debug.h>
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
NTSTATUS STDCALL NtRaiseHardError(VOID) NTSTATUS STDCALL NtRaiseHardError(VOID)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtSetDefaultHardErrorPort(IN HANDLE PortHandle)
STDCALL
NtSetDefaultHardErrorPort(
IN HANDLE PortHandle
)
{ {
UNIMPLEMENTED;
} }

View file

@ -165,7 +165,7 @@ asmlinkage void _main(boot_param* _bp)
for (i=1;i<bp.nr_files;i++) for (i=1;i<bp.nr_files;i++)
{ {
DPRINT("process module at %08lx\n", start); DPRINT("process module at %08lx\n", start);
LdrProcessDriver(start); LdrProcessDriver((PVOID)start);
start=start+PAGE_ROUND_UP(bp.module_length[i]); start=start+PAGE_ROUND_UP(bp.module_length[i]);
} }

View file

@ -19,6 +19,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <string.h> #include <string.h>
#include <internal/string.h> #include <internal/string.h>
#include <stdio.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
@ -494,9 +495,6 @@ void KeExpireTimers(void)
DPRINT("Finished KeExpireTimers()\n"); DPRINT("Finished KeExpireTimers()\n");
} }
extern unsigned int nr_used_blocks;
extern unsigned int EiFreeNonPagedPool;
extern unsigned int EiUsedNonPagedPool;
BOOLEAN KiTimerInterrupt(VOID) BOOLEAN KiTimerInterrupt(VOID)
/* /*
@ -507,8 +505,9 @@ BOOLEAN KiTimerInterrupt(VOID)
char* vidmem=(char *)physical_to_linear(0xb8000 + 160 - 36); char* vidmem=(char *)physical_to_linear(0xb8000 + 160 - 36);
int i; int i;
int x,y; int x,y;
extern ULONG PiNrThreads;
extern ULONG EiNrUsedBlocks; extern ULONG EiNrUsedBlocks;
extern unsigned int EiFreeNonPagedPool;
extern unsigned int EiUsedNonPagedPool;
/* /*
* Increment the number of timers ticks * Increment the number of timers ticks
@ -534,7 +533,8 @@ BOOLEAN KiTimerInterrupt(VOID)
} }
// sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,ticks); // sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,ticks);
memset(str, 0, sizeof(str)); memset(str, 0, sizeof(str));
sprintf(str,"%.8u %.8u",EiNrUsedBlocks,EiFreeNonPagedPool); sprintf(str,"%.8u %.8u",(unsigned int)EiNrUsedBlocks,
(unsigned int)EiFreeNonPagedPool);
// sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,EiUsedNonPagedPool); // sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,EiUsedNonPagedPool);
// sprintf(str,"%.8u %.8u",PiNrThreads,KiTimerTicks); // sprintf(str,"%.8u %.8u",PiNrThreads,KiTimerTicks);
for (i=0;i<17;i++) for (i=0;i<17;i++)

View file

@ -306,6 +306,7 @@ LdrPEProcessDriver(PVOID ModuleLoadBase)
/* Copy image sections into virtual section */ /* Copy image sections into virtual section */
memcpy(DriverBase, ModuleLoadBase, PESectionHeaders[0].PointerToRawData); memcpy(DriverBase, ModuleLoadBase, PESectionHeaders[0].PointerToRawData);
CurrentBase = (PVOID) ((DWORD)DriverBase + PESectionHeaders[0].PointerToRawData); CurrentBase = (PVOID) ((DWORD)DriverBase + PESectionHeaders[0].PointerToRawData);
CurrentSize = 0;
for (Idx = 0; Idx < PEFileHeader->NumberOfSections; Idx++) for (Idx = 0; Idx < PEFileHeader->NumberOfSections; Idx++)
{ {
/* Copy current section into current offset of virtual section */ /* Copy current section into current offset of virtual section */
@ -911,7 +912,6 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, PUNICODE_STRING Filename)
OBJECT_ATTRIBUTES FileObjectAttributes; OBJECT_ATTRIBUTES FileObjectAttributes;
HANDLE FileHandle, SectionHandle, ThreadHandle; HANDLE FileHandle, SectionHandle, ThreadHandle;
CONTEXT Context; CONTEXT Context;
ANSI_STRING AnsiString;
UNICODE_STRING DllPathname; UNICODE_STRING DllPathname;
PIMAGE_DOS_HEADER DosHeader; PIMAGE_DOS_HEADER DosHeader;
PIMAGE_NT_HEADERS NTHeaders; PIMAGE_NT_HEADERS NTHeaders;
@ -1020,7 +1020,7 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, PUNICODE_STRING Filename)
0, 0,
Sections[i].Misc.VirtualSize, Sections[i].Misc.VirtualSize,
&Offset, &Offset,
&Sections[i].Misc.VirtualSize, (PULONG)&Sections[i].Misc.VirtualSize,
0, 0,
MEM_COMMIT, MEM_COMMIT,
PAGE_READWRITE); PAGE_READWRITE);
@ -1152,12 +1152,12 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, PUNICODE_STRING Filename)
DUPLICATE_SAME_ACCESS); DUPLICATE_SAME_ACCESS);
ZwWriteVirtualMemory(ProcessHandle, ZwWriteVirtualMemory(ProcessHandle,
STACK_TOP - 4, (PVOID)(STACK_TOP - 4),
&ImageBase, &ImageBase,
sizeof(ImageBase), sizeof(ImageBase),
&BytesWritten); &BytesWritten);
ZwWriteVirtualMemory(ProcessHandle, ZwWriteVirtualMemory(ProcessHandle,
STACK_TOP - 8, (PVOID)(STACK_TOP - 8),
&DupSectionHandle, &DupSectionHandle,
sizeof(DupSectionHandle), sizeof(DupSectionHandle),
&BytesWritten); &BytesWritten);
@ -1200,10 +1200,13 @@ NTSTATUS LdrLoadImage(HANDLE ProcessHandle, PUNICODE_STRING Filename)
} }
NTSTATUS LdrLoadInitialProcess(VOID) NTSTATUS LdrLoadInitialProcess(VOID)
/*
* FIXME: The location of the initial process should be configurable,
* from command line or registry
*/
{ {
NTSTATUS Status; NTSTATUS Status;
HANDLE ProcessHandle; HANDLE ProcessHandle;
ANSI_STRING AnsiString;
UNICODE_STRING ProcessName; UNICODE_STRING ProcessName;
Status = ZwCreateProcess(&ProcessHandle, Status = ZwCreateProcess(&ProcessHandle,
@ -1220,12 +1223,8 @@ NTSTATUS LdrLoadInitialProcess(VOID)
return Status; return Status;
} }
RtlInitAnsiString(&AnsiString, "\\??\\C:\\reactos\\system\\shell.exe"); RtlInitUnicodeString(&ProcessName, L"\\??\\C:\\reactos\\system\\shell.exe");
RtlAnsiStringToUnicodeString(&ProcessName, &AnsiString, TRUE);
Status = LdrLoadImage(ProcessHandle, &ProcessName); Status = LdrLoadImage(ProcessHandle, &ProcessName);
RtlFreeUnicodeString(&ProcessName);
return Status; return Status;
} }

View file

@ -143,4 +143,5 @@ ex/napi.o: ex/napi.c ../include/ntdll/napi.h
#WITH_DEBUGGING = yes #WITH_DEBUGGING = yes
WIN32_LEAN_AND_MEAN = yes WIN32_LEAN_AND_MEAN = yes
WARNINGS_ARE_ERRORS = yes
include ../rules.mak include ../rules.mak

View file

@ -28,7 +28,6 @@ VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead)
{ {
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
MEMORY_AREA* current; MEMORY_AREA* current;
ULONG i;
DbgPrint("MmDumpMemoryAreas()\n"); DbgPrint("MmDumpMemoryAreas()\n");
@ -45,9 +44,9 @@ VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead)
DbgPrint("Finished MmDumpMemoryAreas()\n"); DbgPrint("Finished MmDumpMemoryAreas()\n");
} }
VOID MmLockMemoryAreaList(ULONG Address, PKIRQL oldlvl) VOID MmLockMemoryAreaList(PVOID Address, PKIRQL oldlvl)
{ {
if (Address >= KERNEL_BASE) if (Address >= (PVOID)KERNEL_BASE)
{ {
KeAcquireSpinLock(&SystemAreaListLock,oldlvl); KeAcquireSpinLock(&SystemAreaListLock,oldlvl);
} }
@ -59,9 +58,9 @@ VOID MmLockMemoryAreaList(ULONG Address, PKIRQL oldlvl)
} }
} }
VOID MmUnlockMemoryAreaList(ULONG Address, PKIRQL oldlvl) VOID MmUnlockMemoryAreaList(PVOID Address, PKIRQL oldlvl)
{ {
if (Address >= KERNEL_BASE) if (Address >= (PVOID)KERNEL_BASE)
{ {
KeReleaseSpinLock(&SystemAreaListLock,*oldlvl); KeReleaseSpinLock(&SystemAreaListLock,*oldlvl);
} }
@ -102,9 +101,9 @@ VOID MmUnlockMemoryAreaListByMode(KPROCESSOR_MODE Mode, PKIRQL oldlvl)
} }
static PLIST_ENTRY MmGetRelatedListHead(PEPROCESS Process, ULONG BaseAddress) static PLIST_ENTRY MmGetRelatedListHead(PEPROCESS Process, PVOID BaseAddress)
{ {
if (BaseAddress >= KERNEL_BASE) if (BaseAddress >= (PVOID)KERNEL_BASE)
{ {
return(&SystemAreaList); return(&SystemAreaList);
} }
@ -115,7 +114,7 @@ static PLIST_ENTRY MmGetRelatedListHead(PEPROCESS Process, ULONG BaseAddress)
} }
static MEMORY_AREA* MmInternalOpenMemoryAreaByAddress(PLIST_ENTRY ListHead, static MEMORY_AREA* MmInternalOpenMemoryAreaByAddress(PLIST_ENTRY ListHead,
ULONG Address) PVOID Address)
{ {
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
MEMORY_AREA* current; MEMORY_AREA* current;
@ -153,7 +152,7 @@ static MEMORY_AREA* MmInternalOpenMemoryAreaByAddress(PLIST_ENTRY ListHead,
MEMORY_AREA* MmInternalOpenMemoryAreaByRegion(PLIST_ENTRY ListHead, MEMORY_AREA* MmInternalOpenMemoryAreaByRegion(PLIST_ENTRY ListHead,
ULONG Address, PVOID Address,
ULONG Length) ULONG Length)
{ {
PLIST_ENTRY current_entry; PLIST_ENTRY current_entry;
@ -178,16 +177,16 @@ MEMORY_AREA* MmInternalOpenMemoryAreaByRegion(PLIST_ENTRY ListHead,
current); current);
return(current); return(current);
} }
Extent = current->BaseAddress + current->Length; Extent = (ULONG)current->BaseAddress + current->Length;
if (Extent > Address && if (Extent > (ULONG)Address &&
Extent < (Address+Length)) Extent < (ULONG)(Address+Length))
{ {
DPRINT("Finished MmInternalOpenMemoryAreaByRegion() = %x\n", DPRINT("Finished MmInternalOpenMemoryAreaByRegion() = %x\n",
current); current);
return(current); return(current);
} }
if (current->BaseAddress <= Address && if (current->BaseAddress <= Address &&
Extent >= (Address+Length)) Extent >= (ULONG)(Address+Length))
{ {
DPRINT("Finished MmInternalOpenMemoryAreaByRegion() = %x\n", DPRINT("Finished MmInternalOpenMemoryAreaByRegion() = %x\n",
current); current);
@ -204,7 +203,8 @@ MEMORY_AREA* MmInternalOpenMemoryAreaByRegion(PLIST_ENTRY ListHead,
return(NULL); return(NULL);
} }
MEMORY_AREA* MmOpenMemoryAreaByRegion(PEPROCESS Process, ULONG Address, MEMORY_AREA* MmOpenMemoryAreaByRegion(PEPROCESS Process,
PVOID Address,
ULONG Length) ULONG Length)
{ {
KIRQL oldlvl; KIRQL oldlvl;
@ -223,7 +223,8 @@ MEMORY_AREA* MmOpenMemoryAreaByRegion(PEPROCESS Process, ULONG Address,
MEMORY_AREA* MmOpenMemoryAreaByRegionWithoutLock(PEPROCESS Process, MEMORY_AREA* MmOpenMemoryAreaByRegionWithoutLock(PEPROCESS Process,
ULONG Address, ULONG Length) PVOID Address,
ULONG Length)
{ {
MEMORY_AREA* Result; MEMORY_AREA* Result;
PLIST_ENTRY ListHead; PLIST_ENTRY ListHead;
@ -249,13 +250,13 @@ MEMORY_AREA* MmOpenMemoryAreaByAddress(PEPROCESS Process, PVOID Address)
} }
MEMORY_AREA* MmOpenMemoryAreaByAddressWithoutLock(PEPROCESS Process, MEMORY_AREA* MmOpenMemoryAreaByAddressWithoutLock(PEPROCESS Process,
ULONG Address) PVOID Address)
{ {
MEMORY_AREA* Result; MEMORY_AREA* Result;
PLIST_ENTRY ListHead; PLIST_ENTRY ListHead;
ListHead = MmGetRelatedListHead(Process, Address); ListHead = MmGetRelatedListHead(Process, Address);
Result = MmInternalOpenMemoryAreaByAddress(ListHead,Address); Result = MmInternalOpenMemoryAreaByAddress(ListHead, Address);
return(Result); return(Result);
} }
@ -323,7 +324,7 @@ static VOID MmInsertMemoryAreaWithoutLock(PEPROCESS Process,
InsertTailList(ListHead,inserted_entry); InsertTailList(ListHead,inserted_entry);
} }
static ULONG MmFindGapWithoutLock(PEPROCESS Process, static PVOID MmFindGapWithoutLock(PEPROCESS Process,
KPROCESSOR_MODE Mode, ULONG Length) KPROCESSOR_MODE Mode, ULONG Length)
{ {
PLIST_ENTRY ListHead; PLIST_ENTRY ListHead;
@ -366,7 +367,7 @@ static ULONG MmFindGapWithoutLock(PEPROCESS Process,
if (current_entry == ListHead) if (current_entry == ListHead)
{ {
assert(Mode==UserMode); assert(Mode==UserMode);
return(MM_LOWEST_USER_ADDRESS); return((PVOID)MM_LOWEST_USER_ADDRESS);
} }
current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry); current = CONTAINING_RECORD(current_entry,MEMORY_AREA,Entry);
@ -398,13 +399,13 @@ NTSTATUS MmFreeMemoryArea(PEPROCESS Process,
DPRINT("MmFreeMemoryArea(Process %x, BaseAddress %x, Length %x," DPRINT("MmFreeMemoryArea(Process %x, BaseAddress %x, Length %x,"
"FreePages %d)\n",Process,BaseAddress,Length,FreePages); "FreePages %d)\n",Process,BaseAddress,Length,FreePages);
MmLockMemoryAreaList((ULONG)BaseAddress,&oldlvl); MmLockMemoryAreaList(BaseAddress, &oldlvl);
MemoryArea = MmOpenMemoryAreaByAddressWithoutLock(Process, MemoryArea = MmOpenMemoryAreaByAddressWithoutLock(Process,
(ULONG)BaseAddress); BaseAddress);
if (MemoryArea==NULL) if (MemoryArea==NULL)
{ {
MmUnlockMemoryAreaList((ULONG)BaseAddress,&oldlvl); MmUnlockMemoryAreaList(BaseAddress, &oldlvl);
return(STATUS_UNSUCCESSFUL); return(STATUS_UNSUCCESSFUL);
} }
if (FreePages) if (FreePages)
@ -419,20 +420,10 @@ NTSTATUS MmFreeMemoryArea(PEPROCESS Process,
RemoveEntryList(&(MemoryArea->Entry)); RemoveEntryList(&(MemoryArea->Entry));
ExFreePool(MemoryArea); ExFreePool(MemoryArea);
MmUnlockMemoryAreaList((ULONG)BaseAddress,&oldlvl); MmUnlockMemoryAreaList(BaseAddress, &oldlvl);
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea)
{
MemoryArea->LockCount++;
}
NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea)
{
MemoryArea->LockCount--;
}
PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process, PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process,
PMEMORY_AREA OriginalMemoryArea, PMEMORY_AREA OriginalMemoryArea,
PVOID BaseAddress, PVOID BaseAddress,
@ -531,8 +522,9 @@ NTSTATUS MmCreateMemoryArea(KPROCESSOR_MODE Mode,
} }
else else
{ {
(*BaseAddress) = PAGE_ROUND_DOWN((*BaseAddress)); (*BaseAddress) = (PVOID)PAGE_ROUND_DOWN((*BaseAddress));
if (MmOpenMemoryAreaByRegionWithoutLock(Process,*BaseAddress, if (MmOpenMemoryAreaByRegionWithoutLock(Process,
*BaseAddress,
Length)!=NULL) Length)!=NULL)
{ {
MmUnlockMemoryAreaList(*BaseAddress,&oldlvl); MmUnlockMemoryAreaList(*BaseAddress,&oldlvl);

View file

@ -68,7 +68,7 @@ PVOID MmMapLockedPages(PMDL Mdl, KPROCESSOR_MODE AccessMode)
DPRINT("Writing %x with physical address %x\n", DPRINT("Writing %x with physical address %x\n",
base+(i*PAGESIZE),mdl_pages[i]); base+(i*PAGESIZE),mdl_pages[i]);
MmSetPage(NULL, MmSetPage(NULL,
(DWORD)base+(i*PAGESIZE), (PVOID)((DWORD)base+(i*PAGESIZE)),
PAGE_READWRITE, PAGE_READWRITE,
mdl_pages[i]); mdl_pages[i]);
} }
@ -119,7 +119,7 @@ VOID MmProbeAndLockPages(PMDL Mdl, KPROCESSOR_MODE AccessMode,
DPRINT("StartVa %x\n",Mdl->StartVa); DPRINT("StartVa %x\n",Mdl->StartVa);
marea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(), marea = MmOpenMemoryAreaByAddress(PsGetCurrentProcess(),
(ULONG)Mdl->StartVa); Mdl->StartVa);
DPRINT("marea %x\n",marea); DPRINT("marea %x\n",marea);
@ -240,8 +240,8 @@ VOID MmInitializeMdl(PMDL MemoryDescriptorList, PVOID Base, ULONG Length)
*/ */
{ {
memset(MemoryDescriptorList,0,sizeof(MDL)); memset(MemoryDescriptorList,0,sizeof(MDL));
MemoryDescriptorList->StartVa = PAGE_ROUND_DOWN(Base); MemoryDescriptorList->StartVa = (PVOID)PAGE_ROUND_DOWN(Base);
MemoryDescriptorList->ByteOffset = Base - PAGE_ROUND_DOWN(Base); MemoryDescriptorList->ByteOffset = (ULONG)(Base - PAGE_ROUND_DOWN(Base));
MemoryDescriptorList->MdlFlags = 0; MemoryDescriptorList->MdlFlags = 0;
MemoryDescriptorList->ByteCount = Length; MemoryDescriptorList->ByteCount = Length;
MemoryDescriptorList->Size = sizeof(MDL) + MemoryDescriptorList->Size = sizeof(MDL) +

View file

@ -110,7 +110,7 @@ void MmInitialize(boot_param* bp)
i<PAGE_ROUND_DOWN(((int)&etext));i=i+PAGESIZE) i<PAGE_ROUND_DOWN(((int)&etext));i=i+PAGESIZE)
{ {
MmSetPageProtect(NULL, MmSetPageProtect(NULL,
i, (PVOID)i,
PAGE_EXECUTE_READ); PAGE_EXECUTE_READ);
} }
DPRINT("end %x\n",(int)&end); DPRINT("end %x\n",(int)&end);
@ -118,7 +118,7 @@ void MmInitialize(boot_param* bp)
i<(KERNEL_BASE+PAGE_TABLE_SIZE);i=i+PAGESIZE) i<(KERNEL_BASE+PAGE_TABLE_SIZE);i=i+PAGESIZE)
{ {
MmSetPage(NULL, MmSetPage(NULL,
i, (PVOID)i,
PAGE_NOACCESS, PAGE_NOACCESS,
0); 0);
} }

View file

@ -80,8 +80,6 @@ ULONG EiNrUsedBlocks = 0;
*/ */
static unsigned int alloc_map[ALLOC_MAP_SIZE/32]={0,}; static unsigned int alloc_map[ALLOC_MAP_SIZE/32]={0,};
static unsigned int pool_free_mem = 0;
unsigned int EiFreeNonPagedPool = 0; unsigned int EiFreeNonPagedPool = 0;
unsigned int EiUsedNonPagedPool = 0; unsigned int EiUsedNonPagedPool = 0;
@ -92,6 +90,7 @@ VOID ExInitNonPagedPool(ULONG BaseAddress)
kernel_pool_base=BaseAddress; kernel_pool_base=BaseAddress;
} }
#if 0
static void validate_free_list(void) static void validate_free_list(void)
/* /*
* FUNCTION: Validate the integrity of the list of free blocks * FUNCTION: Validate the integrity of the list of free blocks
@ -260,6 +259,7 @@ static void validate_kernel_pool(void)
current=current->next; current=current->next;
} }
} }
#endif
static void add_to_free_list(block_hdr* blk) static void add_to_free_list(block_hdr* blk)
/* /*
@ -431,7 +431,7 @@ static block_hdr* grow_kernel_pool(unsigned int size)
for (i=0;i<nr_pages;i++) for (i=0;i<nr_pages;i++)
{ {
MmSetPage(NULL, MmSetPage(NULL,
start + (i*PAGESIZE), (PVOID)(start + (i*PAGESIZE)),
PAGE_READWRITE, PAGE_READWRITE,
get_free_page()); get_free_page());
} }
@ -567,44 +567,6 @@ asmlinkage VOID ExFreePool(PVOID block)
VALIDATE_POOL; VALIDATE_POOL;
} }
static void defrag_free_list(void)
/*
* FUNCTION: defrag the list of free blocks
*/
{
block_hdr* current=free_list_head,*current2;
ULONG addr1,addr2,max=0;
DPRINT("Begin defrag free,tot free=%d,tot used=%d\n"
,EiFreeNonPagedPool
,EiUsedNonPagedPool);
while (current)
{
addr1=(ULONG)current;
current2=current->next;
while(current2)
{
addr2=(ULONG)current2;
if(addr2==addr1+current->size+sizeof(block_hdr))
{
remove_from_free_list(current2);
current->size+=current2->size+sizeof(block_hdr);
if(current->size>max)max=current->size;
}
else if(addr1==addr2+current2->size+sizeof(block_hdr))
{
remove_from_free_list(current);
current2->size+=current->size+sizeof(block_hdr);
if(current2->size>max)max=current2->size;
break;
}
current2=current2->next;
}
current=current->next;
}
DPRINT("Finish To defrag free blocks,max=%d\n",max);
}
PVOID ExAllocateNonPagedPoolWithTag(ULONG type, PVOID ExAllocateNonPagedPoolWithTag(ULONG type,
ULONG size, ULONG size,
ULONG Tag, ULONG Tag,

View file

@ -48,7 +48,7 @@ PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes)
Block = ExAllocateNonPagedPoolWithTag(PoolType, Block = ExAllocateNonPagedPoolWithTag(PoolType,
NumberOfBytes, NumberOfBytes,
TAG_NONE, TAG_NONE,
(&PoolType)[-1]); (PVOID)(&PoolType)[-1]);
return(Block); return(Block);
} }
@ -71,7 +71,7 @@ PVOID ExAllocatePoolWithTag(ULONG PoolType, ULONG NumberOfBytes, ULONG Tag)
Block = ExAllocateNonPagedPoolWithTag(PoolType, Block = ExAllocateNonPagedPoolWithTag(PoolType,
NumberOfBytes, NumberOfBytes,
Tag, Tag,
(&PoolType)[-1]); (PVOID)(&PoolType)[-1]);
break; break;
case PagedPool: case PagedPool:
@ -91,31 +91,8 @@ PVOID ExAllocatePoolWithTag(ULONG PoolType, ULONG NumberOfBytes, ULONG Tag)
return(Block); return(Block);
} }
PVOID ExAllocatePoolWithQuotaTag(POOL_TYPE PoolType, ULONG NumberOfBytes,
ULONG Tag)
{
PVOID Block;
PKTHREAD current = KeGetCurrentThread();
Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,Tag);
switch(PoolType)
{
case NonPagedPool:
case NonPagedPoolMustSucceed:
case NonPagedPoolCacheAligned:
case NonPagedPoolCacheAlignedMustS:
// current->NPagedPoolQuota = current->NPagedPoolQuota - NumberOfBytes;
break;
case PagedPool:
case PagedPoolCacheAligned:
// current->PagedPoolQuota = current->PagedPoolQuota - NumberOfBytes;
break;
};
return(Block);
}
PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes) PVOID ExAllocatePoolWithQuota(POOL_TYPE PoolType, ULONG NumberOfBytes)
{ {
return(ExAllocatePoolWithQuotaTag(PoolType,NumberOfBytes,TAG_NONE)); // return(ExAllocatePoolWithQuotaTag(PoolType,NumberOfBytes,TAG_NONE));
UNIMPLEMENTED;
} }

View file

@ -15,6 +15,7 @@
#include <internal/ob.h> #include <internal/ob.h>
#include <internal/io.h> #include <internal/io.h>
#include <internal/ps.h> #include <internal/ps.h>
#include <wchar.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
@ -31,9 +32,9 @@ VOID MmpDeleteSection(PVOID ObjectBody)
NTSTATUS MmpCreateSection(PVOID ObjectBody, NTSTATUS MmpCreateSection(PVOID ObjectBody,
PVOID Parent, PVOID Parent,
PWSTR RemainingPath) PWSTR RemainingPath,
POBJECT_ATTRIBUTES ObjectAttributes)
{ {
PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)ObjectBody;
NTSTATUS Status; NTSTATUS Status;
DPRINT("MmpCreateDevice(ObjectBody %x, Parent %x, RemainingPath %w)\n", DPRINT("MmpCreateDevice(ObjectBody %x, Parent %x, RemainingPath %w)\n",

View file

@ -20,7 +20,7 @@
PVOID MmAllocateSection(ULONG Length) PVOID MmAllocateSection(ULONG Length)
{ {
ULONG Result; PVOID Result;
MEMORY_AREA* marea; MEMORY_AREA* marea;
NTSTATUS Status; NTSTATUS Status;
ULONG i; ULONG i;
@ -39,7 +39,7 @@ PVOID MmAllocateSection(ULONG Length)
{ {
return(NULL); return(NULL);
} }
DPRINT("Result %x\n",Result); DPRINT("Result %p\n",Result);
for (i=0;i<=(Length/PAGESIZE);i++) for (i=0;i<=(Length/PAGESIZE);i++)
{ {
MmSetPage(NULL, MmSetPage(NULL,
@ -65,13 +65,13 @@ PVOID MmMapIoSpace(PHYSICAL_ADDRESS PhysicalAddress,
ULONG NumberOfBytes, ULONG NumberOfBytes,
BOOLEAN CacheEnable) BOOLEAN CacheEnable)
{ {
ULONG Result; PVOID Result;
MEMORY_AREA* marea; MEMORY_AREA* marea;
NTSTATUS Status; NTSTATUS Status;
ULONG i; ULONG i;
ULONG Attributes; ULONG Attributes;
Result=0; Result = 0;
Status = MmCreateMemoryArea(KernelMode, Status = MmCreateMemoryArea(KernelMode,
PsGetCurrentProcess(), PsGetCurrentProcess(),
MEMORY_AREA_IO_MAPPING, MEMORY_AREA_IO_MAPPING,
@ -106,12 +106,12 @@ VOID MmUnmapIoSpace(PVOID BaseAddress, ULONG NumberOfBytes)
PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes) PVOID MmAllocateNonCachedMemory(ULONG NumberOfBytes)
{ {
ULONG Result; PVOID Result;
MEMORY_AREA* marea; MEMORY_AREA* marea;
NTSTATUS Status; NTSTATUS Status;
ULONG i; ULONG i;
Result=0; Result = 0;
Status = MmCreateMemoryArea(KernelMode, Status = MmCreateMemoryArea(KernelMode,
PsGetCurrentProcess(), PsGetCurrentProcess(),
MEMORY_AREA_NO_CACHE, MEMORY_AREA_NO_CACHE,

View file

@ -91,7 +91,7 @@ void VirtualInit(boot_param* bp)
MmInitSectionImplementation(); MmInitSectionImplementation();
} }
ULONG MmCommitedSectionHandleFault(MEMORY_AREA* MemoryArea, ULONG Address) ULONG MmCommitedSectionHandleFault(MEMORY_AREA* MemoryArea, PVOID Address)
{ {
MmSetPage(PsGetCurrentProcess(), MmSetPage(PsGetCurrentProcess(),
Address, Address,
@ -208,7 +208,7 @@ asmlinkage int page_fault_handler(unsigned int cs,
break; break;
case MEMORY_AREA_COMMIT: case MEMORY_AREA_COMMIT:
stat = MmCommitedSectionHandleFault(MemoryArea,cr2); stat = MmCommitedSectionHandleFault(MemoryArea,(PVOID)cr2);
break; break;
default: default:
@ -669,7 +669,8 @@ NTSTATUS STDCALL ZwReadVirtualMemory(IN HANDLE ProcessHandle,
for (i=0; i<(NumberOfBytesToRead/PAGESIZE); i++) for (i=0; i<(NumberOfBytesToRead/PAGESIZE); i++)
{ {
CurrentEntry = MmGetPageEntry(Process, (DWORD)BaseAddress + (i*PAGESIZE)); CurrentEntry = MmGetPageEntry(Process,
(PVOID)((DWORD)BaseAddress + (i*PAGESIZE)));
RtlCopyMemory(Buffer + (i*PAGESIZE), RtlCopyMemory(Buffer + (i*PAGESIZE),
(PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)), (PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)),
PAGESIZE); PAGESIZE);
@ -717,7 +718,6 @@ NTSTATUS STDCALL ZwWriteVirtualMemory(IN HANDLE ProcessHandle,
OUT PULONG NumberOfBytesWritten) OUT PULONG NumberOfBytesWritten)
{ {
PEPROCESS Process; PEPROCESS Process;
PMEMORY_AREA InMemoryArea;
PMEMORY_AREA OutMemoryArea; PMEMORY_AREA OutMemoryArea;
ULONG i; ULONG i;
NTSTATUS Status; NTSTATUS Status;
@ -759,8 +759,9 @@ NTSTATUS STDCALL ZwWriteVirtualMemory(IN HANDLE ProcessHandle,
OutMemoryArea->Attributes, OutMemoryArea->Attributes,
get_free_page()); get_free_page());
} }
CurrentEntry = MmGetPageEntry(Process, (DWORD)BaseAddress + CurrentEntry = MmGetPageEntry(Process,
(i*PAGESIZE)); (PVOID)((DWORD)BaseAddress +
(i*PAGESIZE)));
RtlCopyMemory((PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)) + RtlCopyMemory((PVOID)physical_to_linear(PAGE_MASK(*CurrentEntry)) +
(((DWORD)BaseAddress)%PAGESIZE), (((DWORD)BaseAddress)%PAGESIZE),
Buffer + (i*PAGESIZE), Buffer + (i*PAGESIZE),

View file

@ -130,6 +130,8 @@ NTSTATUS ExInitializeZone(PZONE_HEADER Zone, ULONG BlockSize,
PushEntryList(&Zone->FreeList,&entry->Entry); PushEntryList(&Zone->FreeList,&entry->Entry);
entry = (PZONE_ENTRY)(((PVOID)entry) + sizeof(ZONE_ENTRY) + BlockSize); entry = (PZONE_ENTRY)(((PVOID)entry) + sizeof(ZONE_ENTRY) + BlockSize);
} }
return(STATUS_SUCCESS);
} }
PVOID ExInterlockedFreeToZone(PZONE_HEADER Zone, PVOID Block, PVOID ExInterlockedFreeToZone(PZONE_HEADER Zone, PVOID Block,

View file

@ -3,7 +3,7 @@
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/nt/nt.c * FILE: ntoskrnl/nt/nt.c
* PURPOSE: Initialization of system call interfaces * PURPOSE: Initialization of system call interfaces
* PROGRAMMER: David Welch (welch@mcmail.com) * PROGRAMMER: David Welch (welch@cwcom.net)
* UPDATE HISTORY: * UPDATE HISTORY:
* Created 22/05/98 * Created 22/05/98
*/ */
@ -11,6 +11,7 @@
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/nt.h>
#include <internal/debug.h> #include <internal/debug.h>

View file

@ -19,8 +19,7 @@
NTSTATUS STDCALL NtCancelTimer(IN HANDLE TimerHandle, NTSTATUS STDCALL NtCancelTimer(IN HANDLE TimerHandle,
OUT PBOOLEAN CurrentState OPTIONAL) OUT PBOOLEAN CurrentState OPTIONAL)
{ {
return(ZwCancelTimer(TimerHandle, UNIMPLEMENTED;
CurrentState));
} }
NTSTATUS STDCALL ZwCancelTimer(IN HANDLE TimerHandle, NTSTATUS STDCALL ZwCancelTimer(IN HANDLE TimerHandle,

View file

@ -34,6 +34,40 @@ typedef struct
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
static PHANDLE_REP ObpGetObjectByHandle(PEPROCESS Process,
HANDLE h)
/*
* FUNCTION: Get the data structure for a handle
* ARGUMENTS:
* Process = Process to get the handle for
* h = Handle
* ARGUMENTS: A pointer to the information about the handle on success,
* NULL on failure
*/
{
PLIST_ENTRY current;
unsigned int handle = ((unsigned int)h) - 1;
unsigned int count=handle/HANDLE_BLOCK_ENTRIES;
HANDLE_BLOCK* blk = NULL;
unsigned int i;
DPRINT("ObpGetObjectByHandle(Process %x, h %x)\n",Process,h);
current = Process->Pcb.HandleTable.ListHead.Flink;
DPRINT("current %x\n",current);
for (i=0;i<count;i++)
{
current = current->Flink;
if (current==(&(Process->Pcb.HandleTable.ListHead)))
{
return(NULL);
}
}
blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES]));
}
NTSTATUS STDCALL NtDuplicateObject(IN HANDLE SourceProcessHandle, NTSTATUS STDCALL NtDuplicateObject(IN HANDLE SourceProcessHandle,
IN PHANDLE SourceHandle, IN PHANDLE SourceHandle,
@ -180,41 +214,6 @@ VOID ObCreateHandleTable(PEPROCESS Parent,
} }
} }
static PHANDLE_REP ObpGetObjectByHandle(PEPROCESS Process,
HANDLE h)
/*
* FUNCTION: Get the data structure for a handle
* ARGUMENTS:
* Process = Process to get the handle for
* h = Handle
* ARGUMENTS: A pointer to the information about the handle on success,
* NULL on failure
*/
{
PLIST_ENTRY current;
unsigned int handle = ((unsigned int)h) - 1;
unsigned int count=handle/HANDLE_BLOCK_ENTRIES;
HANDLE_BLOCK* blk = NULL;
unsigned int i;
DPRINT("ObpGetObjectByHandle(Process %x, h %x)\n",Process,h);
current = Process->Pcb.HandleTable.ListHead.Flink;
DPRINT("current %x\n",current);
for (i=0;i<count;i++)
{
current = current->Flink;
if (current==(&(Process->Pcb.HandleTable.ListHead)))
{
return(NULL);
}
}
blk = CONTAINING_RECORD(current,HANDLE_BLOCK,entry);
return(&(blk->handles[handle%HANDLE_BLOCK_ENTRIES]));
}
VOID ObDeleteHandle(HANDLE Handle) VOID ObDeleteHandle(HANDLE Handle)
{ {
PHANDLE_REP Rep; PHANDLE_REP Rep;

View file

@ -133,7 +133,6 @@ PVOID ObpParseDirectory(PVOID Object, PWSTR* Path)
{ {
PWSTR end; PWSTR end;
PVOID FoundObject; PVOID FoundObject;
NTSTATUS Status;
DPRINT("ObpParseDirectory(Object %x, Path %x, *Path %w)\n", DPRINT("ObpParseDirectory(Object %x, Path %x, *Path %w)\n",
Object,Path,*Path); Object,Path,*Path);

View file

@ -11,18 +11,19 @@
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ke.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
/* GLOBALS *******************************************************************/ /* GLOBALS *******************************************************************/
HANDLE IdleThreadHandle = NULL; HANDLE PsIdleThreadHandle = NULL;
extern ULONG DpcQueueSize; extern ULONG DpcQueueSize;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
static VOID PsIdleThreadMain(PVOID Context) static NTSTATUS PsIdleThreadMain(PVOID Context)
{ {
KIRQL oldlvl; KIRQL oldlvl;
@ -43,7 +44,7 @@ VOID PsInitIdleThread(VOID)
{ {
KPRIORITY Priority; KPRIORITY Priority;
PsCreateSystemThread(&IdleThreadHandle, PsCreateSystemThread(&PsIdleThreadHandle,
THREAD_ALL_ACCESS, THREAD_ALL_ACCESS,
NULL, NULL,
NULL, NULL,
@ -52,7 +53,7 @@ VOID PsInitIdleThread(VOID)
NULL); NULL);
Priority = THREAD_PRIORITY_IDLE; Priority = THREAD_PRIORITY_IDLE;
ZwSetInformationThread(IdleThreadHandle, ZwSetInformationThread(PsIdleThreadHandle,
ThreadPriority, ThreadPriority,
&Priority, &Priority,
sizeof(Priority)); sizeof(Priority));

View file

@ -3,7 +3,7 @@
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ps/kill.c * FILE: ntoskrnl/ps/kill.c
* PURPOSE: Terminating a thread * PURPOSE: Terminating a thread
* PROGRAMMER: David Welch (welch@mcmail.com) * PROGRAMMER: David Welch (welch@cwcom.net)
* UPDATE HISTORY: * UPDATE HISTORY:
* Created 22/05/98 * Created 22/05/98
*/ */
@ -12,6 +12,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ps.h> #include <internal/ps.h>
#include <internal/ke.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
@ -62,7 +63,6 @@ NTSTATUS STDCALL NtTerminateProcess(IN HANDLE ProcessHandle,
NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle, NTSTATUS STDCALL ZwTerminateProcess(IN HANDLE ProcessHandle,
IN NTSTATUS ExitStatus) IN NTSTATUS ExitStatus)
{ {
PETHREAD Thread;
NTSTATUS Status; NTSTATUS Status;
PEPROCESS Process; PEPROCESS Process;
KIRQL oldlvl; KIRQL oldlvl;

View file

@ -13,6 +13,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <internal/ob.h> #include <internal/ob.h>
#include <internal/mm.h> #include <internal/mm.h>
#include <internal/ke.h>
#include <string.h> #include <string.h>
#include <internal/string.h> #include <internal/string.h>
@ -161,9 +162,6 @@ NTSTATUS STDCALL ZwCreateProcess(
PULONG CurrentPageDirectory; PULONG CurrentPageDirectory;
ULONG i; ULONG i;
PKPROCESS KProcess; PKPROCESS KProcess;
ULONG Base;
ULONG Length;
LARGE_INTEGER Offset;
NTSTATUS Status; NTSTATUS Status;
DPRINT("ZwCreateProcess(ObjectAttributes %x)\n",ObjectAttributes); DPRINT("ZwCreateProcess(ObjectAttributes %x)\n",ObjectAttributes);
@ -196,10 +194,10 @@ NTSTATUS STDCALL ZwCreateProcess(
InheritObjectTable, InheritObjectTable,
Process); Process);
PageDirectory = physical_to_linear((ULONG)get_free_page()); PageDirectory = (PULONG)physical_to_linear((ULONG)get_free_page());
KProcess->PageTableDirectory = PageDirectory; KProcess->PageTableDirectory = PageDirectory;
CurrentPageDirectory = get_page_directory(); CurrentPageDirectory = (PULONG)get_page_directory();
memset(PageDirectory,0,PAGESIZE); memset(PageDirectory,0,PAGESIZE);
for (i=768;i<1024;i++) for (i=768;i<1024;i++)
@ -260,10 +258,10 @@ NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,
IN ULONG ProcessInformationLength, IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength) OUT PULONG ReturnLength)
{ {
PEPROCESS Process; // PEPROCESS Process;
NTSTATUS Status; NTSTATUS Status;
Status = ObReferenceObjectByHandle(ProcessHandle, /* Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_QUERY_INFORMATION, PROCESS_QUERY_INFORMATION,
PsProcessType, PsProcessType,
UserMode, UserMode,
@ -272,7 +270,7 @@ NTSTATUS STDCALL ZwQueryInformationProcess(IN HANDLE ProcessHandle,
if (Status != STATUS_SUCCESS) if (Status != STATUS_SUCCESS)
{ {
return(Status); return(Status);
} }*/
switch (ProcessInformationClass) switch (ProcessInformationClass)
{ {
@ -319,10 +317,10 @@ NTSTATUS STDCALL ZwSetInformationProcess(IN HANDLE ProcessHandle,
IN PVOID ProcessInformation, IN PVOID ProcessInformation,
IN ULONG ProcessInformationLength) IN ULONG ProcessInformationLength)
{ {
PEPROCESS Process; // PEPROCESS Process;
NTSTATUS Status; NTSTATUS Status;
Status = ObReferenceObjectByHandle(ProcessHandle, /* Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_SET_INFORMATION, PROCESS_SET_INFORMATION,
PsProcessType, PsProcessType,
UserMode, UserMode,
@ -331,7 +329,7 @@ NTSTATUS STDCALL ZwSetInformationProcess(IN HANDLE ProcessHandle,
if (Status != STATUS_SUCCESS) if (Status != STATUS_SUCCESS)
{ {
return(Status); return(Status);
} }*/
switch (ProcessInformationClass) switch (ProcessInformationClass)
{ {

View file

@ -210,8 +210,6 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
ACCESS_MASK DesiredAccess, ACCESS_MASK DesiredAccess,
POBJECT_ATTRIBUTES ThreadAttributes) POBJECT_ATTRIBUTES ThreadAttributes)
{ {
ULONG ThreadId;
ULONG ProcessId;
PETHREAD Thread; PETHREAD Thread;
NTSTATUS Status; NTSTATUS Status;
@ -256,7 +254,8 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
UserMode); UserMode);
InitializeListHead(Thread->Tcb.ApcList); InitializeListHead(Thread->Tcb.ApcList);
InitializeListHead(&(Thread->IrpList)); InitializeListHead(&(Thread->IrpList));
Thread->Cid.UniqueThread=InterlockedIncrement(&NextThreadUniqueId); Thread->Cid.UniqueThread = (HANDLE)InterlockedIncrement(
&NextThreadUniqueId);
ObReferenceObjectByPointer(Thread, ObReferenceObjectByPointer(Thread,
THREAD_ALL_ACCESS, THREAD_ALL_ACCESS,
PsThreadType, PsThreadType,

View file

@ -45,7 +45,8 @@ NTSTATUS ZwSetInformationThread(HANDLE ThreadHandle,
ThreadBasicInformationP->TebBaseAddress = Thread->Tcb.Teb; ThreadBasicInformationP->TebBaseAddress = Thread->Tcb.Teb;
ThreadBasicInformationP->AffinityMask = Thread->Tcb.Affinity; ThreadBasicInformationP->AffinityMask = Thread->Tcb.Affinity;
ThreadBasicInformationP->BasePriority = Thread->Tcb.BasePriority; ThreadBasicInformationP->BasePriority = Thread->Tcb.BasePriority;
ThreadBasicInformationP->UniqueThreadId = Thread->Cid.UniqueThread; ThreadBasicInformationP->UniqueThreadId = (ULONG)
Thread->Cid.UniqueThread;
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
break; break;

View file

@ -48,7 +48,7 @@ VOID RtlCopyBytes(PVOID Destination,
RtlCopyMemory(Destination,Source,Length); RtlCopyMemory(Destination,Source,Length);
} }
VOID RtlCopyMemory(VOID* Destination, VOID* Source, ULONG Length) VOID RtlCopyMemory(VOID* Destination, CONST VOID* Source, ULONG Length)
{ {
DPRINT("RtlCopyMemory(Destination %x Source %x Length %d\n", DPRINT("RtlCopyMemory(Destination %x Source %x Length %d\n",
Destination,Source,Length); Destination,Source,Length);

View file

@ -16,12 +16,11 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
#undef memcpy
void *memcpy (void *to, const void *from, size_t count) void *memcpy (void *to, const void *from, size_t count)
{ {
register char *f = from; const char *f = from;
register char *t = to; char *t = to;
register int i = count; int i = count;
while (i-- > 0) while (i-- > 0)
*t++ = *f++; *t++ = *f++;

View file

@ -16,8 +16,3 @@
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
VOID RtlGetCallersAddress(PVOID* CallersAddress)
{
PULONG stk = (PULONG)(&CallersAddress);
*CallersAddress = stk[-1];
}

View file

@ -21,14 +21,8 @@
#define Aa_Difference ('A'-'a') #define Aa_Difference ('A'-'a')
PUNICODE_STRING RtlDuplicateUnicodeString(PUNICODE_STRING Dest, extern unsigned long simple_strtoul(const char *cp, char **endp,
PUNICODE_STRING Src) unsigned int base);
{
if (Dest==NULL)
{
Dest=ExAllocatePool(NonPagedPool,sizeof(UNICODE_STRING));
}
}
VOID RtlUpperString(PSTRING DestinationString, PSTRING SourceString) VOID RtlUpperString(PSTRING DestinationString, PSTRING SourceString)
{ {
@ -128,7 +122,8 @@ NTSTATUS RtlAppendUnicodeToString(IN OUT PUNICODE_STRING Destination,
NTSTATUS RtlCharToInteger(IN PCSZ String, IN ULONG Base, IN OUT PULONG Value) NTSTATUS RtlCharToInteger(IN PCSZ String, IN ULONG Base, IN OUT PULONG Value)
{ {
*Value=simple_strtoul((const char *)String, NULL, Base); *Value=simple_strtoul((const char *)String, NULL, Base);
}; return(STATUS_SUCCESS);
}
LONG RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInsensitive) LONG RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInsensitive)
{ {
@ -348,7 +343,7 @@ VOID RtlInitString(IN OUT PSTRING DestinationString,
VOID RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString, VOID RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString) IN PCWSTR SourceString)
{ {
unsigned long i, DestSize; unsigned long DestSize;
DPRINT("RtlInitUnicodeString(DestinationString %x, " DPRINT("RtlInitUnicodeString(DestinationString %x, "
"SourceString %x)\n",DestinationString,SourceString); "SourceString %x)\n",DestinationString,SourceString);
@ -368,6 +363,7 @@ VOID RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,
} }
} }
#if 0
NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base, /* optional */ NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base, /* optional */
IN OUT PUNICODE_STRING String) IN OUT PUNICODE_STRING String)
{ {
@ -384,7 +380,7 @@ NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base,
if(Base==2) { if(Base==2) {
sprintf(str, "%b", Value); sprintf(str, "%b", Value);
} else { } else {
sprintf(str, "%u", Value); sprintf(str, "%u", (unsigned int)Value);
}; };
len=strlen(str); len=strlen(str);
@ -402,7 +398,8 @@ NTSTATUS RtlIntegerToUnicodeString(IN ULONG Value, IN ULONG Base,
ExFreePool(str); ExFreePool(str);
return STATUS_SUCCESS; return STATUS_SUCCESS;
}; }
#endif
NTSTATUS RtlUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString, NTSTATUS RtlUnicodeStringToAnsiString(IN OUT PANSI_STRING DestinationString,
IN PUNICODE_STRING SourceString, IN PUNICODE_STRING SourceString,
@ -487,7 +484,8 @@ NTSTATUS RtlUnicodeStringToInteger(IN PUNICODE_STRING String, IN ULONG Base,
*Value=simple_strtoul(str, NULL, Base); *Value=simple_strtoul(str, NULL, Base);
ExFreePool(str); ExFreePool(str);
}; return(STATUS_SUCCESS);
}
NTSTATUS RtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString, NTSTATUS RtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString, IN PUNICODE_STRING SourceString,

View file

@ -18,6 +18,7 @@
#include <internal/debug.h> #include <internal/debug.h>
#include <string.h> #include <string.h>
#include <internal/string.h> #include <internal/string.h>
#include <ctype.h>
#include <ddk/ntddk.h> #include <ddk/ntddk.h>

View file

@ -13,6 +13,7 @@
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <wchar.h> #include <wchar.h>
#include <ctype.h>
#define NDEBUG #define NDEBUG
#include <internal/debug.h> #include <internal/debug.h>
@ -62,7 +63,6 @@ wcschr(const wchar_t *str, wchar_t ch)
return NULL; return NULL;
} }
#if 0
wchar_t towupper(wchar_t w) wchar_t towupper(wchar_t w)
{ {
if (w < L'A') if (w < L'A')
@ -74,11 +74,10 @@ wchar_t towupper(wchar_t w)
return(w); return(w);
} }
} }
#endif
int wcsicmp(const wchar_t* cs, const wchar_t* ct) int wcsicmp(const wchar_t* cs, const wchar_t* ct)
{ {
while (*cs != '\0' && *ct != '\0' && wtoupper(*cs) == wtoupper(*ct)) while (*cs != '\0' && *ct != '\0' && towupper(*cs) == towupper(*ct))
{ {
cs++; cs++;
ct++; ct++;

View file

@ -68,6 +68,7 @@ NtSetSecurityObject(
IN PSECURITY_DESCRIPTOR SecurityDescriptor IN PSECURITY_DESCRIPTOR SecurityDescriptor
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -79,6 +80,7 @@ NtSetInformationToken(
IN ULONG TokenInformationLength IN ULONG TokenInformationLength
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -89,6 +91,7 @@ NtPrivilegeCheck(
IN PBOOLEAN Result IN PBOOLEAN Result
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -101,6 +104,7 @@ NtPrivilegedServiceAuditAlarm(
IN BOOLEAN AccessGranted IN BOOLEAN AccessGranted
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -112,8 +116,10 @@ NtPrivilegeObjectAuditAlarm(
IN ULONG DesiredAccess, IN ULONG DesiredAccess,
IN PPRIVILEGE_SET Privileges, IN PPRIVILEGE_SET Privileges,
IN BOOLEAN AccessGranted IN BOOLEAN AccessGranted
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -131,6 +137,7 @@ NtOpenObjectAuditAlarm(
OUT PBOOLEAN GenerateOnClose OUT PBOOLEAN GenerateOnClose
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -141,6 +148,7 @@ NtOpenProcessToken(
OUT PHANDLE TokenHandle OUT PHANDLE TokenHandle
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS
@ -152,71 +160,58 @@ NtOpenThreadToken(
OUT PHANDLE TokenHandle OUT PHANDLE TokenHandle
) )
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtDuplicateToken(IN HANDLE ExistingToken,
STDCALL
NtDuplicateToken(
IN HANDLE ExistingToken,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, IN SECURITY_IMPERSONATION_LEVEL
ImpersonationLevel,
IN TOKEN_TYPE TokenType, IN TOKEN_TYPE TokenType,
OUT PHANDLE NewToken OUT PHANDLE NewToken)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS STDCALL NtImpersonateClientOfPort(VOID) NTSTATUS STDCALL NtImpersonateClientOfPort(VOID)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtImpersonateThread(IN HANDLE ThreadHandle,
STDCALL
NtImpersonateThread(
IN HANDLE ThreadHandle,
IN HANDLE ThreadToImpersonate, IN HANDLE ThreadToImpersonate,
IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService IN PSECURITY_QUALITY_OF_SERVICE
) SecurityQualityOfService)
{ {
UNIMPLEMENTED;
} }
NTSTATUS STDCALL NtCreateToken(VOID) NTSTATUS STDCALL NtCreateToken(VOID)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtDeleteObjectAuditAlarm(IN PUNICODE_STRING SubsystemName,
STDCALL
NtDeleteObjectAuditAlarm (
IN PUNICODE_STRING SubsystemName,
IN PVOID HandleId, IN PVOID HandleId,
IN BOOLEAN GenerateOnClose IN BOOLEAN GenerateOnClose)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId)
STDCALL
NtAllocateLocallyUniqueId(
OUT LUID *LocallyUniqueId
)
{ {
return(ZwAllocateLocallyUniqueId(LocallyUniqueId));
} }
NTSTATUS NTSTATUS STDCALL ZwAllocateLocallyUniqueId(OUT LUID *LocallyUniqueId)
STDCALL
ZwAllocateLocallyUniqueId(
OUT LUID *LocallyUniqueId
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtAccessCheckAndAuditAlarm(IN PUNICODE_STRING SubsystemName,
STDCALL
NtAccessCheckAndAuditAlarm(
IN PUNICODE_STRING SubsystemName,
IN PHANDLE ObjectHandle, IN PHANDLE ObjectHandle,
IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_ATTRIBUTES ObjectAttributes,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
@ -224,107 +219,98 @@ NtAccessCheckAndAuditAlarm(
IN BOOLEAN ObjectCreation, IN BOOLEAN ObjectCreation,
OUT PULONG GrantedAccess, OUT PULONG GrantedAccess,
OUT PBOOLEAN AccessStatus, OUT PBOOLEAN AccessStatus,
OUT PBOOLEAN GenerateOnClose OUT PBOOLEAN GenerateOnClose)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtAdjustGroupsToken(IN HANDLE TokenHandle,
STDCALL
NtAdjustGroupsToken(
IN HANDLE TokenHandle,
IN BOOLEAN ResetToDefault, IN BOOLEAN ResetToDefault,
IN PTOKEN_GROUPS NewState, IN PTOKEN_GROUPS NewState,
IN ULONG BufferLength, IN ULONG BufferLength,
OUT PTOKEN_GROUPS PreviousState OPTIONAL, OUT PTOKEN_GROUPS PreviousState OPTIONAL,
OUT PULONG ReturnLength OUT PULONG ReturnLength)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtAdjustPrivilegesToken(IN HANDLE TokenHandle,
STDCALL
NtAdjustPrivilegesToken(
IN HANDLE TokenHandle,
IN BOOLEAN DisableAllPrivileges, IN BOOLEAN DisableAllPrivileges,
IN PTOKEN_PRIVILEGES NewState, IN PTOKEN_PRIVILEGES NewState,
IN ULONG BufferLength, IN ULONG BufferLength,
OUT PTOKEN_PRIVILEGES PreviousState, OUT PTOKEN_PRIVILEGES PreviousState,
OUT PULONG ReturnLength OUT PULONG ReturnLength)
)
{ {
return(ZwAdjustPrivilegesToken(TokenHandle,
DisableAllPrivileges,
NewState,
BufferLength,
PreviousState,
ReturnLength));
} }
NTSTATUS
STDCALL NTSTATUS STDCALL ZwAdjustPrivilegesToken(IN HANDLE TokenHandle,
ZwAdjustPrivilegesToken(
IN HANDLE TokenHandle,
IN BOOLEAN DisableAllPrivileges, IN BOOLEAN DisableAllPrivileges,
IN PTOKEN_PRIVILEGES NewState, IN PTOKEN_PRIVILEGES NewState,
IN ULONG BufferLength, IN ULONG BufferLength,
OUT PTOKEN_PRIVILEGES PreviousState, OUT PTOKEN_PRIVILEGES PreviousState,
OUT PULONG ReturnLength OUT PULONG ReturnLength)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtAllocateUuids(PLARGE_INTEGER Time,
STDCALL
NtAllocateUuids(
PLARGE_INTEGER Time,
PULONG Version, // ??? PULONG Version, // ???
PULONG ClockCycle PULONG ClockCycle)
)
{ {
return(ZwAllocateUuids(Time,
Version,
ClockCycle));
} }
NTSTATUS NTSTATUS STDCALL ZwAllocateUuids(PLARGE_INTEGER Time,
STDCALL
ZwAllocateUuids(
PLARGE_INTEGER Time,
PULONG Version, // ??? PULONG Version, // ???
PULONG ClockCycle PULONG ClockCycle)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName,
STDCALL
NtCloseObjectAuditAlarm(
IN PUNICODE_STRING SubsystemName,
IN PVOID HandleId, IN PVOID HandleId,
IN BOOLEAN GenerateOnClose IN BOOLEAN GenerateOnClose)
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS NTSTATUS STDCALL NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
STDCALL IN HANDLE ClientToken,
NtAccessCheck( IN ACCESS_MASK DesiredAccess,
IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PGENERIC_MAPPING GenericMapping,
OUT PRIVILEGE_SET PrivilegeSet,
OUT PULONG ReturnLength,
OUT PULONG GrantedAccess,
OUT PBOOLEAN AccessStatus)
{
return(ZwAccessCheck(SecurityDescriptor,
ClientToken,
DesiredAccess,
GenericMapping,
PrivilegeSet,
ReturnLength,
GrantedAccess,
AccessStatus));
}
NTSTATUS STDCALL ZwAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN HANDLE ClientToken, IN HANDLE ClientToken,
IN ACCESS_MASK DesiredAcces, IN ACCESS_MASK DesiredAcces,
IN PGENERIC_MAPPING GenericMapping, IN PGENERIC_MAPPING GenericMapping,
OUT PRIVILEGE_SET PrivilegeSet, OUT PRIVILEGE_SET PrivilegeSet,
OUT PULONG ReturnLength, OUT PULONG ReturnLength,
OUT PULONG GrantedAccess, OUT PULONG GrantedAccess,
OUT PBOOLEAN AccessStatus OUT PBOOLEAN AccessStatus)
)
{
}
NTSTATUS
STDCALL
ZwAccessCheck(
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN HANDLE ClientToken,
IN ACCESS_MASK DesiredAcces,
IN PGENERIC_MAPPING GenericMapping,
OUT PRIVILEGE_SET PrivilegeSet,
OUT PULONG ReturnLength,
OUT PULONG GrantedAccess,
OUT PBOOLEAN AccessStatus
)
{ {
UNIMPLEMENTED;
} }
NTSTATUS RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor, NTSTATUS RtlCreateSecurityDescriptor(PSECURITY_DESCRIPTOR SecurityDescriptor,

View file

@ -77,7 +77,7 @@ int main(int argc, char* argv[])
fprintf(stdout,"{\"_%s\",(unsigned int)%s},\n",sym[j],sym[j]); fprintf(stdout,"{\"_%s\",(unsigned int)%s},\n",sym[j],sym[j]);
} }
fprintf(stdout,"{NULL,NULL},\n"); fprintf(stdout,"{(char *)NULL,0},\n");
fprintf(stdout,"};\n"); fprintf(stdout,"};\n");
return(0); return(0);

View file

@ -40,6 +40,10 @@ else
DEBUGGING_CFLAGS = DEBUGGING_CFLAGS =
endif endif
ifeq ($(WARNINGS_ARE_ERRORS),yes)
EXTRA_CFLAGS = -Werror
endif
DEFINES = -DDBG -DCOMPILER_LARGE_INTEGERS DEFINES = -DDBG -DCOMPILER_LARGE_INTEGERS
ifeq ($(WIN32_LEAN_AND_MEAN),yes) ifeq ($(WIN32_LEAN_AND_MEAN),yes)
@ -52,7 +56,8 @@ CC = $(PREFIX)gcc
NATIVE_CC = gcc NATIVE_CC = gcc
CFLAGS = -O2 -I../../../include -I../../include \ CFLAGS = -O2 -I../../../include -I../../include \
-I../include -fno-builtin $(LEAN_AND_MEAN_DEFINE) \ -I../include -fno-builtin $(LEAN_AND_MEAN_DEFINE) \
$(DEFINES) -Wall -Wstrict-prototypes $(DEBUGGING_CFLAGS) $(DEFINES) -Wall -Wstrict-prototypes $(DEBUGGING_CFLAGS) \
$(EXTRA_CFLAGS)
CXXFLAGS = $(CFLAGS) CXXFLAGS = $(CFLAGS)
NFLAGS = -i../../include/ -i../include/ -pinternal/asm.inc -f$(NASM_FORMAT) -d$(NASM_FORMAT) NFLAGS = -i../../include/ -i../include/ -pinternal/asm.inc -f$(NASM_FORMAT) -d$(NASM_FORMAT)
LD = $(PREFIX)ld LD = $(PREFIX)ld