From 8f8c71dfb9c64681213e4e82dd68d7ea50addd4f Mon Sep 17 00:00:00 2001 From: David Welch Date: Sat, 19 Dec 1998 18:56:57 +0000 Subject: [PATCH] Minor bug fixes svn path=/trunk/; revision=126 --- reactos/ntoskrnl/hal/x86/exp.c | 16 ++++++ reactos/ntoskrnl/hal/x86/printk.c | 2 +- reactos/ntoskrnl/io/buildirp.c | 29 +++++++++- reactos/ntoskrnl/io/cleanup.c | 1 + reactos/ntoskrnl/io/cntrller.c | 30 +++++------ reactos/ntoskrnl/io/create.c | 14 +++-- reactos/ntoskrnl/io/device.c | 17 +++--- reactos/ntoskrnl/io/dir.c | 89 ++++++++++++++++++++++++------- reactos/ntoskrnl/io/fs.c | 2 + reactos/ntoskrnl/ke/bug.c | 2 +- reactos/ntoskrnl/ke/catch.c | 26 +++++---- reactos/ntoskrnl/ke/main.c | 2 +- reactos/ntoskrnl/ke/timer.c | 19 ++++++- reactos/ntoskrnl/mm/npool.c | 55 +++++++++++++++---- reactos/ntoskrnl/mm/pool.c | 7 ++- reactos/ntoskrnl/ob/namespc.c | 31 ++++++++--- reactos/ntoskrnl/ps/kill.c | 1 + reactos/ntoskrnl/rtl/unicode.c | 2 +- reactos/ntoskrnl/rtl/wstring.c | 45 +++++++++++----- reactos/ntoskrnl/se/semgr.c | 50 +++++++++++------ reactos/ntoskrnl/tst/test.c | 4 +- 21 files changed, 328 insertions(+), 116 deletions(-) diff --git a/reactos/ntoskrnl/hal/x86/exp.c b/reactos/ntoskrnl/hal/x86/exp.c index 4481a8ecad2..7c8236eb8a0 100644 --- a/reactos/ntoskrnl/hal/x86/exp.c +++ b/reactos/ntoskrnl/hal/x86/exp.c @@ -255,6 +255,22 @@ asmlinkage void exception_handler(unsigned int edi, for(;;); } +VOID KeDumpStackFrames(ULONG DummyArg) +{ + PULONG Stack = ((PULONG)&DummyArg)[-1]; + ULONG i; + + DbgPrint("Frames:\n"); + for (i=0; i<32; i++) + { + if (Stack[i] > KERNEL_BASE) + { + DbgPrint("%.8x ",Stack[i]); + } + } + DbgPrint("\n"); +} + static void set_system_call_gate(unsigned int sel, unsigned int func) { DPRINT("sel %x %d\n",sel,sel); diff --git a/reactos/ntoskrnl/hal/x86/printk.c b/reactos/ntoskrnl/hal/x86/printk.c index 89f519f7359..1f479ae378b 100644 --- a/reactos/ntoskrnl/hal/x86/printk.c +++ b/reactos/ntoskrnl/hal/x86/printk.c @@ -16,7 +16,7 @@ #include #include -//#define BOCHS_DEBUGGING 1 +#define BOCHS_DEBUGGING 1 //#define SERIAL_DEBUGGING #define SERIAL_PORT 0x03f8 #define SERIAL_BAUD_RATE 19200 diff --git a/reactos/ntoskrnl/io/buildirp.c b/reactos/ntoskrnl/io/buildirp.c index 08590d4b4af..f4119df9d5e 100644 --- a/reactos/ntoskrnl/io/buildirp.c +++ b/reactos/ntoskrnl/io/buildirp.c @@ -21,7 +21,31 @@ NTSTATUS IoPrepareIrpBuffer(PIRP Irp, PDEVICE_OBJECT DeviceObject, PVOID Buffer, PVOID Length) +/* + * FUNCTION: Prepares the buffer to be used for an IRP + */ { + Irp->UserBuffer = (LPVOID)Buffer; + if (DeviceObject->Flags&DO_BUFFERED_IO) + { + DPRINT("Doing buffer i/o\n",0); + Irp->AssociatedIrp.SystemBuffer = (PVOID) + ExAllocatePool(NonPagedPool,Length); + if (Irp->AssociatedIrp.SystemBuffer==NULL) + { + return(STATUS_UNSUCCESSFUL); + } + } + if (DeviceObject->Flags&DO_DIRECT_IO) + { + DPRINT("Doing direct i/o\n",0); + + Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length); + MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess); + Irp->UserBuffer = NULL; + Irp->AssociatedIrp.SystemBuffer = NULL; + } + return(STATUS_SUCCESS); } PIRP IoBuildFilesystemControlRequest(ULONG MinorFunction, @@ -218,11 +242,12 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, Irp->UserIosb = IoStatusBlock; if (DeviceObject->Flags&DO_BUFFERED_IO) { - DPRINT("Doing buffer i/o\n",0); + DPRINT("Doing buffer i/o\n"); Irp->AssociatedIrp.SystemBuffer = (PVOID) ExAllocatePool(NonPagedPool,Length); if (Irp->AssociatedIrp.SystemBuffer==NULL) { + IoFreeIrp(Irp); return(NULL); } if (MajorFunction == IRP_MJ_WRITE) @@ -232,7 +257,7 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, } if (DeviceObject->Flags&DO_DIRECT_IO) { - DPRINT("Doing direct i/o\n",0); + DPRINT("Doing direct i/o\n"); Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length); if (MajorFunction == IRP_MJ_READ) diff --git a/reactos/ntoskrnl/io/cleanup.c b/reactos/ntoskrnl/io/cleanup.c index 5b537da3544..7e31c4ac5f6 100644 --- a/reactos/ntoskrnl/io/cleanup.c +++ b/reactos/ntoskrnl/io/cleanup.c @@ -41,6 +41,7 @@ VOID IoReadWriteCompletion(PDEVICE_OBJECT DeviceObject, } if (DeviceObject->Flags & DO_DIRECT_IO) { + DPRINT("Tearing down MDL\n"); if (Irp->MdlAddress->MappedSystemVa!=NULL) { MmUnmapLockedPages(Irp->MdlAddress->MappedSystemVa, diff --git a/reactos/ntoskrnl/io/cntrller.c b/reactos/ntoskrnl/io/cntrller.c index 0f798083881..987021f5461 100644 --- a/reactos/ntoskrnl/io/cntrller.c +++ b/reactos/ntoskrnl/io/cntrller.c @@ -67,8 +67,8 @@ VOID IoAllocateController(PCONTROLLER_OBJECT ControllerObject, if (Result == DeallocateObject) { IoFreeController(ControllerObject); - ExFreePool(entry); } + ExFreePool(entry); } PCONTROLLER_OBJECT IoCreateController(ULONG Size) @@ -121,23 +121,23 @@ VOID IoFreeController(PCONTROLLER_OBJECT ControllerObject) * ControllerObject = Controller object to be released */ { - PKDEVICE_QUEUE_ENTRY QEntry = KeRemoveDeviceQueue(&ControllerObject-> - DeviceWaitQueue); - CONTROLLER_QUEUE_ENTRY* Entry = CONTAINING_RECORD(QEntry, - CONTROLLER_QUEUE_ENTRY, - Entry); + PKDEVICE_QUEUE_ENTRY QEntry; + CONTROLLER_QUEUE_ENTRY* Entry; IO_ALLOCATION_ACTION Result; - if (QEntry==NULL) - { - return; - } - Result = Entry->ExecutionRoutine(Entry->DeviceObject, - Entry->DeviceObject->CurrentIrp,NULL, - Entry->Context); - if (Result == DeallocateObject) + do { + QEntry = KeRemoveDeviceQueue(&ControllerObject->DeviceWaitQueue); + Entry = CONTAINING_RECORD(QEntry,CONTROLLER_QUEUE_ENTRY,Entry); + if (QEntry==NULL) + { + return; + } + Result = Entry->ExecutionRoutine(Entry->DeviceObject, + Entry->DeviceObject->CurrentIrp, + NULL, + Entry->Context); ExFreePool(Entry); - } + } while (Result == DeallocateObject); } diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index 32021103fbd..509f903be05 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -124,6 +124,7 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle, DeviceObject = (PDEVICE_OBJECT)Object; + DPRINT("DeviceObject %x\n",DeviceObject); DeviceObject = IoGetAttachedDevice(DeviceObject); DPRINT("DeviceObject %x\n",DeviceObject); @@ -140,30 +141,37 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle, else { CHECKPOINT; + DPRINT("DeviceObject %x\n",DeviceObject); + DPRINT("FileHandle %x\n",FileHandle); if (DeviceObject->DeviceType != FILE_DEVICE_FILE_SYSTEM && DeviceObject->DeviceType != FILE_DEVICE_DISK) { + CHECKPOINT; ZwClose(*FileHandle); *FileHandle=0; return(STATUS_UNSUCCESSFUL); } + DPRINT("DeviceObject->Vpb %x\n",DeviceObject->Vpb); if (!(DeviceObject->Vpb->Flags & VPB_MOUNTED)) { + CHECKPOINT; Status = IoTryToMountStorageDevice(DeviceObject); if (Status!=STATUS_SUCCESS) { + CHECKPOINT; ZwClose(*FileHandle); *FileHandle=0; return(Status); } DeviceObject = IoGetAttachedDevice(DeviceObject); } - DPRINT("Remainder %w\n",Remainder); +// DPRINT("Remainder %x\n",Remainder); +// DPRINT("Remainder %w\n",Remainder); FileObject->FileName.Buffer = ExAllocatePool(NonPagedPool, wstrlen(Remainder)); RtlInitUnicodeString(&(FileObject->FileName),Remainder); - DPRINT("FileObject->FileName.Buffer %x %w\n", - FileObject->FileName.Buffer,FileObject->FileName.Buffer); +// DPRINT("FileObject->FileName.Buffer %x %w\n", +// FileObject->FileName.Buffer,FileObject->FileName.Buffer); } CHECKPOINT; diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index 6d9e478f790..927fa993447 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -22,24 +22,19 @@ /* FUNCTIONS ***************************************************************/ -NTSTATUS -STDCALL -NtUnloadDriver( - IN PUNICODE_STRING DriverServiceName - ) +NTSTATUS STDCALL NtUnloadDriver(IN PUNICODE_STRING DriverServiceName) { + return(ZwUnloadDriver(DriverServiceName)); } -NTSTATUS -STDCALL -ZwUnloadDriver( - IN PUNICODE_STRING DriverServiceName - ) +NTSTATUS STDCALL ZwUnloadDriver(IN PUNICODE_STRING DriverServiceName) { + UNIMPLEMENTED; } NTSTATUS NtLoadDriver(PUNICODE_STRING DriverServiceName) { + return(ZwLoadDriver(DriverServiceName)); } NTSTATUS ZwLoadDriver(PUNICODE_STRING DriverServiceName) @@ -50,6 +45,7 @@ NTSTATUS ZwLoadDriver(PUNICODE_STRING DriverServiceName) * RETURNS: Status */ { + UNIMPLEMENTED; } NTSTATUS IoAttachDeviceByPointer(PDEVICE_OBJECT SourceDevice, @@ -105,6 +101,7 @@ PDEVICE_OBJECT IoAttachDeviceToDeviceStack(PDEVICE_OBJECT SourceDevice, AttachedDevice->AttachedDevice = SourceDevice; SourceDevice->StackSize = AttachedDevice->StackSize + 1; + SourceDevice->Vpb = AttachedDevice->Vpb; return(AttachedDevice); } diff --git a/reactos/ntoskrnl/io/dir.c b/reactos/ntoskrnl/io/dir.c index e2bec7c0a29..bbb1f97f052 100644 --- a/reactos/ntoskrnl/io/dir.c +++ b/reactos/ntoskrnl/io/dir.c @@ -3,7 +3,7 @@ * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/dir.c * PURPOSE: Directory functions - * PROGRAMMER: David Welch (welch@mcmail.com) + * PROGRAMMER: David Welch (welch@cwcom.net) * UPDATE HISTORY: * Created 22/05/98 */ @@ -17,20 +17,18 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS STDCALL -NtQueryDirectoryFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN BOOLEAN ReturnSingleEntry, - IN PUNICODE_STRING FileName OPTIONAL, - IN BOOLEAN RestartScan - ) +NTSTATUS STDCALL NtQueryDirectoryFile(IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS + FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan) { return(ZwQueryDirectoryFile(FileHandle, Event, @@ -133,6 +131,8 @@ NTSTATUS STDCALL ZwQueryDirectoryFile( NTSTATUS Status; KEVENT Event; PIO_STACK_LOCATION IoStack; + BOOLEAN IndexSpecified; + ULONG Idx; Status = ObReferenceObjectByHandle(FileHandle, FILE_LIST_DIRECTORY, @@ -156,20 +156,71 @@ NTSTATUS STDCALL ZwQueryDirectoryFile( Irp->UserEvent = &Event; IoStack = IoGetNextIrpStackLocation(Irp); + + IoStack->Flags = 0; + if (RestartScan) + { + IoStack->Flags = IoStack->Flags | SL_RESTART_SCAN; + } + if (ReturnSingleEntry) + { + IoStack->Flags = IoStack->Flags | SL_RETURN_SINGLE_ENTRY; + } + + switch (FileInformationClass) + { + case FileNameInformation: + Idx = ((PFILE_NAMES_INFORMATION)FileInformation)->FileIndex; + if (Idx != 0) + { + IoStack->Parameters.QueryDirectory.FileIndex = Idx; + IoStack->Flags = IoStack->Flags | SL_INDEX_SPECIFIED; + } + break; + + case FileDirectoryInformation: + Idx = ((PFILE_DIRECTORY_INFORMATION)FileInformation)->FileIndex; + if (Idx != 0) + { + IoStack->Parameters.QueryDirectory.FileIndex = Idx; + IoStack->Flags = IoStack->Flags | SL_INDEX_SPECIFIED; + } + break; + + case FileFullDirectoryInformation: + Idx = ((PFILE_FULL_DIR_INFORMATION)FileInformation)->FileIndex; + if (Idx != 0) + { + IoStack->Parameters.QueryDirectory.FileIndex = Idx; + IoStack->Flags = IoStack->Flags | SL_INDEX_SPECIFIED; + } + break; + + case FileBothDirectoryInformation: + Idx = ((PFILE_BOTH_DIR_INFORMATION)FileInformation)->FileIndex; + if (Idx != 0) + { + IoStack->Parameters.QueryDirectory.FileIndex = Idx; + IoStack->Flags = IoStack->Flags | SL_INDEX_SPECIFIED; + } + break; + + default: + return(STATUS_UNSUCCESSFUL); + } + IoStack->MajorFunction = IRP_MJ_DIRECTORY_CONTROL; IoStack->MinorFunction = IRP_MN_QUERY_DIRECTORY; - IoStack->Flags = 0; + IoStack->Control = 0; IoStack->DeviceObject = DeviceObject; IoStack->FileObject = FileObject; IoStack->Parameters.QueryDirectory.FileInformationClass = FileInformationClass; - IoStack->Parameters.QueryDirectory.ReturnSingleEntry = - ReturnSingleEntry; IoStack->Parameters.QueryDirectory.FileName = FileName; - IoStack->Parameters.QueryDirectory.RestartScan = RestartScan; + IoStack->Parameters.QueryDirectory.Length = Length; Status = IoCallDriver(FileObject->DeviceObject,Irp); if (Status==STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO)) diff --git a/reactos/ntoskrnl/io/fs.c b/reactos/ntoskrnl/io/fs.c index 7c24a0ecc47..1bfa13262fd 100644 --- a/reactos/ntoskrnl/io/fs.c +++ b/reactos/ntoskrnl/io/fs.c @@ -145,6 +145,8 @@ NTSTATUS IoTryToMountStorageDevice(PDEVICE_OBJECT DeviceObject) break; case STATUS_SUCCESS: + DeviceObject->Vpb->Flags = DeviceObject->Vpb->Flags | + VPB_MOUNTED; KeReleaseSpinLock(&FileSystemListLock,oldlvl); return(STATUS_SUCCESS); diff --git a/reactos/ntoskrnl/ke/bug.c b/reactos/ntoskrnl/ke/bug.c index ba9c7cd4e6d..03c1b8ffefe 100644 --- a/reactos/ntoskrnl/ke/bug.c +++ b/reactos/ntoskrnl/ke/bug.c @@ -65,7 +65,7 @@ VOID KeBugCheckEx(ULONG BugCheckCode, DbgPrint("Bug detected (code %x param %x %x %x %x)\n",BugCheckCode, BugCheckParameter1,BugCheckParameter2,BugCheckParameter3, BugCheckParameter4); - *((unsigned int *)0)=0; + KeDumpStackFrames(); for(;;); } diff --git a/reactos/ntoskrnl/ke/catch.c b/reactos/ntoskrnl/ke/catch.c index 98b3c5a8df7..f6ffd166195 100644 --- a/reactos/ntoskrnl/ke/catch.c +++ b/reactos/ntoskrnl/ke/catch.c @@ -11,6 +11,8 @@ #include #include +#include + /* FUNCTIONS ****************************************************************/ VOID ExRaiseStatus(NTSTATUS Status) @@ -20,22 +22,18 @@ VOID ExRaiseStatus(NTSTATUS Status) } -NTSTATUS -STDCALL -NtRaiseException( - IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context, - IN BOOL IsDebugger OPTIONAL - ) +NTSTATUS STDCALL NtRaiseException(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOL IsDebugger OPTIONAL) { + return(ZwRaiseException(ExceptionRecord, + Context, + IsDebugger)); } -NTSTATUS -STDCALL -ZwRaiseException( - IN PEXCEPTION_RECORD ExceptionRecord, - IN PCONTEXT Context, - IN BOOL IsDebugger OPTIONAL - ) +NTSTATUS STDCALL ZwRaiseException(IN PEXCEPTION_RECORD ExceptionRecord, + IN PCONTEXT Context, + IN BOOL IsDebugger OPTIONAL) { + UNIMPLEMENTED; } diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index 14063aa0638..1e6c4d39986 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -22,7 +22,7 @@ #include #include -//#define NDEBUG +#define NDEBUG #include /* FUNCTIONS ****************************************************************/ diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index b3dd8a17203..ccaa2e8719e 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -461,6 +461,8 @@ void KeExpireTimers(void) } extern unsigned int nr_used_blocks; +extern unsigned int EiFreeNonPagedPool; +extern unsigned int EiUsedNonPagedPool; VOID KiTimerInterrupt(VOID) /* @@ -470,6 +472,7 @@ VOID KiTimerInterrupt(VOID) char str[36]; char* vidmem=(char *)physical_to_linear(0xb8000 + 160 - 36); int i; + int x,y; /* * Increment the number of timers ticks @@ -481,7 +484,21 @@ VOID KiTimerInterrupt(VOID) * Display the tick count in the top left of the screen as a debugging * aid */ - sprintf(str,"%.8u %.8u",nr_used_blocks,ticks); +// sprintf(str,"%.8u %.8u",nr_used_blocks,ticks); + if ((EiFreeNonPagedPool + EiUsedNonPagedPool) == 0) + { + x = y = 0; + } + else + { + x = (EiFreeNonPagedPool * 100) / + (EiFreeNonPagedPool + EiUsedNonPagedPool); + y = (EiUsedNonPagedPool * 100) / + (EiFreeNonPagedPool + EiUsedNonPagedPool); + } +// sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,ticks); + sprintf(str,"%.4u %.4u %.7u",x,y,ticks); +// sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,EiUsedNonPagedPool); for (i=0;i<17;i++) { *vidmem=str[i]; diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index 27159b2dc4e..a82999e22dd 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -28,6 +28,11 @@ #include +#if 0 +#define VALIDATE_POOL validate_kernel_pool() +#else +#define VALIDATE_POOL +#endif /* TYPES *******************************************************************/ @@ -70,6 +75,9 @@ static unsigned int alloc_map[ALLOC_MAP_SIZE/32]={0,}; static unsigned int pool_free_mem = 0; +unsigned int EiFreeNonPagedPool = 0; +unsigned int EiUsedNonPagedPool = 0; + /* FUNCTIONS ***************************************************************/ VOID ExInitNonPagedPool(ULONG BaseAddress) @@ -430,6 +438,9 @@ static block_hdr* grow_kernel_pool(unsigned int size) free_blk->magic = BLOCK_HDR_MAGIC; free_blk->size = (nr_pages * PAGESIZE) -((sizeof(block_hdr)*2) + size); add_to_free_list(free_blk); + + EiFreeNonPagedPool = EiFreeNonPagedPool + free_blk->size; + EiUsedNonPagedPool = EiUsedNonPagedPool + used_blk->size; } else { @@ -437,9 +448,11 @@ static block_hdr* grow_kernel_pool(unsigned int size) used_blk->magic = BLOCK_HDR_MAGIC; used_blk->size = nr_pages * PAGESIZE; add_to_used_list(used_blk); + + EiUsedNonPagedPool = EiUsedNonPagedPool + used_blk->size; } - validate_kernel_pool(); + VALIDATE_POOL; return(used_blk); } @@ -458,12 +471,16 @@ static void* take_block(block_hdr* current, unsigned int size) */ if (current->size > (1 + size + sizeof(block_hdr))) { + block_hdr* free_blk; + + EiFreeNonPagedPool = EiFreeNonPagedPool - current->size; + /* * Replace the bigger block with a smaller block in the * same position in the list */ - block_hdr* free_blk = (block_hdr *)(((int)current) - + sizeof(block_hdr) + size); + free_blk = (block_hdr *)(((int)current) + + sizeof(block_hdr) + size); free_blk->magic = BLOCK_HDR_MAGIC; free_blk->next = current->next; free_blk->previous = current->previous; @@ -484,7 +501,10 @@ static void* take_block(block_hdr* current, unsigned int size) current->size=size; add_to_used_list(current); - validate_kernel_pool(); + EiUsedNonPagedPool = EiUsedNonPagedPool + current->size; + EiFreeNonPagedPool = EiFreeNonPagedPool + free_blk->size; + + VALIDATE_POOL; return(block_to_address(current)); } @@ -494,7 +514,10 @@ static void* take_block(block_hdr* current, unsigned int size) remove_from_free_list(current); add_to_used_list(current); - validate_kernel_pool(); + EiFreeNonPagedPool = EiFreeNonPagedPool - current->size; + EiUsedNonPagedPool = EiUsedNonPagedPool + current->size; + + VALIDATE_POOL; return(block_to_address(current)); } @@ -508,14 +531,28 @@ asmlinkage VOID ExFreePool(PVOID block) block_hdr* blk=address_to_block(block); OLD_DPRINT("(%s:%d) freeing block %x\n",__FILE__,__LINE__,blk); - validate_kernel_pool(); +// DbgPrint("ExFreePool(block %x), size %d, caller %x\n",block,blk->size, +// ((PULONG)&block)[-1]); + + VALIDATE_POOL; + + if (blk->magic != BLOCK_HDR_MAGIC) + { + DbgPrint("ExFreePool of non-allocated address\n"); + for(;;); + return; + } + /* * Please don't change the order */ remove_from_used_list(blk); add_to_free_list(blk); - validate_kernel_pool(); + EiUsedNonPagedPool = EiUsedNonPagedPool - blk->size; + EiFreeNonPagedPool = EiFreeNonPagedPool + blk->size; + + VALIDATE_POOL; } PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag) @@ -525,8 +562,8 @@ PVOID ExAllocateNonPagedPoolWithTag(ULONG type, ULONG size, ULONG Tag) // DbgPrint("Blocks on free list %d\n",nr_free_blocks); // DbgPrint("Blocks on used list %d\n",nr_used_blocks); - OLD_DPRINT("ExAllocateNonPagedPool(type %d, size %d)\n",type,size); - validate_kernel_pool(); +// OLD_DPRINT("ExAllocateNonPagedPool(type %d, size %d)\n",type,size); + VALIDATE_POOL; /* * accomodate this useful idiom diff --git a/reactos/ntoskrnl/mm/pool.c b/reactos/ntoskrnl/mm/pool.c index bbfc0624c60..16f657804b6 100644 --- a/reactos/ntoskrnl/mm/pool.c +++ b/reactos/ntoskrnl/mm/pool.c @@ -44,7 +44,12 @@ PVOID ExAllocatePool(POOL_TYPE PoolType, ULONG NumberOfBytes) * NULL on failure */ { - return(ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE)); + PVOID Block; +// DbgPrint("ExAllocatePool(NumberOfBytes %d) caller %x\n", +// NumberOfBytes,((PULONG)&PoolType)[-1]); + Block = ExAllocatePoolWithTag(PoolType,NumberOfBytes,TAG_NONE); +// DbgPrint("ExAllocatePool() = %x\n",Block); + return(Block); } PVOID ExAllocatePoolWithTag(ULONG type, ULONG size, ULONG Tag) diff --git a/reactos/ntoskrnl/ob/namespc.c b/reactos/ntoskrnl/ob/namespc.c index 4b78890ebe9..61d2eeea1ee 100644 --- a/reactos/ntoskrnl/ob/namespc.c +++ b/reactos/ntoskrnl/ob/namespc.c @@ -239,7 +239,8 @@ NTSTATUS ObOpenObjectByName(POBJECT_ATTRIBUTES ObjectAttributes, Status = ObLookupObject(ObjectAttributes->RootDirectory, ObjectAttributes->ObjectName->Buffer, Object, - UnparsedSection); + UnparsedSection, + ObjectAttributes->Attributes); DPRINT("*Object %x\n",*Object); DPRINT("ObjectAttributes->ObjectName->Length %d\n", ObjectAttributes->ObjectName->Length); @@ -348,7 +349,8 @@ VOID InitializeObjectAttributes(POBJECT_ATTRIBUTES InitializedAttributes, InitializedAttributes->SecurityQualityOfService=NULL; } -static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name) +static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name, + ULONG Attributes) /* * FUNCTION: Looks up an entry within a namespace directory * ARGUMENTS: @@ -379,9 +381,21 @@ static PVOID ObDirLookup(PDIRECTORY_OBJECT dir, PWSTR name) { current_obj = CONTAINING_RECORD(current,OBJECT_HEADER,Entry); DPRINT("Scanning %w\n",current_obj->Name.Buffer); - if ( wcscmp(current_obj->Name.Buffer, name)==0) + if (Attributes & OBJ_CASE_INSENSITIVE) { - return(HEADER_TO_BODY(current_obj)); + if (wcsicmp(current_obj->Name.Buffer, name)==0) + { + DPRINT("Found it %x\n",HEADER_TO_BODY(current_obj)); + return(HEADER_TO_BODY(current_obj)); + } + } + else + { + if ( wcscmp(current_obj->Name.Buffer, name)==0) + { + DPRINT("Found it %x\n",HEADER_TO_BODY(current_obj)); + return(HEADER_TO_BODY(current_obj)); + } } current = current->Flink; } @@ -419,7 +433,7 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object) } NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, - PWSTR* UnparsedSection) + PWSTR* UnparsedSection, ULONG Attributes) /* * FUNCTION: Lookup an object within the system namespc * ARGUMENTS: @@ -489,11 +503,12 @@ NTSTATUS ObLookupObject(HANDLE rootdir, PWSTR string, PVOID* Object, } DPRINT("\n",0); - current_dir=(PDIRECTORY_OBJECT)ObDirLookup(current_dir,current); + current_dir=(PDIRECTORY_OBJECT)ObDirLookup(current_dir,current, + Attributes); if (current_dir==NULL) { - DbgPrint("(%s:%d) Path component not found\n",__FILE__, - __LINE__); + DbgPrint("(%s:%d) Path component %w not found\n",__FILE__, + __LINE__,current); return(STATUS_UNSUCCESSFUL); } diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index b0d7e7d9152..17032f68176 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -13,6 +13,7 @@ #include #include +#define NDEBUG #include /* FUNCTIONS *****************************************************************/ diff --git a/reactos/ntoskrnl/rtl/unicode.c b/reactos/ntoskrnl/rtl/unicode.c index a97d8458f42..047ce95005f 100644 --- a/reactos/ntoskrnl/rtl/unicode.c +++ b/reactos/ntoskrnl/rtl/unicode.c @@ -531,4 +531,4 @@ VOID RtlUpcaseString(IN OUT PSTRING DestinationString, DestinationString->Buffer-=len; SourceString->Buffer-=len; -}; +} diff --git a/reactos/ntoskrnl/rtl/wstring.c b/reactos/ntoskrnl/rtl/wstring.c index ea228fa73d9..920bf814ee4 100644 --- a/reactos/ntoskrnl/rtl/wstring.c +++ b/reactos/ntoskrnl/rtl/wstring.c @@ -51,8 +51,29 @@ wcschr(const wchar_t *str, wchar_t ch) return NULL; } -int -wcscmp(const wchar_t *cs, const wchar_t *ct) +wchar_t towupper(wchar_t w) +{ + if (w < L'A') + { + return(w+'A'); + } + else + { + return(w); + } +} + +int wcsicmp(const wchar_t* cs, const wchar_t* ct) +{ + while (*cs != '\0' && *ct != '\0' && towupper(*cs) == towupper(*ct)) + { + cs++; + ct++; + } + return *cs - *ct; +} + +int wcscmp(const wchar_t *cs, const wchar_t *ct) { while (*cs != '\0' && *ct != '\0' && *cs == *ct) { @@ -62,19 +83,17 @@ wcscmp(const wchar_t *cs, const wchar_t *ct) return *cs - *ct; } -wchar_t * -wcscpy(wchar_t *str1, const wchar_t *str2) +wchar_t* wcscpy(wchar_t* str1, const wchar_t* str2) { - while ( (*str1)==(*str2) ) + wchar_t* s = str1; + DbgPrint("wcscpy(str1 %w, str2 %w)\n",str1,str2); + while ((*str2)!=0) { - str1++; + *s = *str2; + s++; str2++; - if ( (*str1)==((wchar_t)0) && (*str1)==((wchar_t)0) ) - { - return(0); - } } - return(wchar_t *)( (*str1) - (*str2) ); + return(str1); } #ifdef i386 @@ -117,7 +136,7 @@ UNIMPLEMENTED; #endif -#ifdef i386 +#if 0 int wcsicmp(const wchar_t *cs,const wchar_t *ct) @@ -158,7 +177,7 @@ wcsicmp(const wchar_t *cs,const wchar_t *ct) return __res; } -#else + int wcsicmp(const wchar_t *cs,const wchar_t *ct) diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index 329c3073220..7dce4db5210 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -16,28 +16,48 @@ /* FUNCTIONS ***************************************************************/ -NTSTATUS -STDCALL -NtQueryInformationToken( - IN HANDLE TokenHandle, +NTSTATUS STDCALL ZwQueryInformationToken(IN HANDLE TokenHandle, IN TOKEN_INFORMATION_CLASS TokenInformationClass, OUT PVOID TokenInformation, IN ULONG TokenInformationLength, - OUT PULONG ReturnLength - ) + OUT PULONG ReturnLength) { + UNIMPLEMENTED; } -NTSTATUS -STDCALL -NtQuerySecurityObject( - IN HANDLE Object, - IN CINT SecurityObjectInformationClass, - OUT PVOID SecurityObjectInformation, - IN ULONG Length, - OUT PULONG ReturnLength - ) +NTSTATUS STDCALL NtQueryInformationToken(IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength) { + return(ZwQueryInformationToken(TokenHandle, + TokenInformationClass, + TokenInformation, + TokenInformationLength, + ReturnLength)); +} + +NTSTATUS STDCALL ZwQuerySecurityObject(IN HANDLE Object, + IN CINT SecurityObjectInformationClass, + OUT PVOID SecurityObjectInformation, + IN ULONG Length, + OUT PULONG ReturnLength) +{ + UNIMPLEMENTED; +} + +NTSTATUS STDCALL NtQuerySecurityObject(IN HANDLE Object, + IN CINT SecurityObjectInformationClass, + OUT PVOID SecurityObjectInformation, + IN ULONG Length, + OUT PULONG ReturnLength) +{ + return(ZwQuerySecurityObject(Object, + SecurityObjectInformationClass, + SecurityObjectInformation, + Length, + ReturnLength)); } NTSTATUS diff --git a/reactos/ntoskrnl/tst/test.c b/reactos/ntoskrnl/tst/test.c index 9cdbd6a9c0b..e5afcc3f182 100644 --- a/reactos/ntoskrnl/tst/test.c +++ b/reactos/ntoskrnl/tst/test.c @@ -130,12 +130,12 @@ VOID ExExecuteShell(VOID) BaseAddress = (PVOID)0x10000; SectionOffset.HighPart = 0; SectionOffset.LowPart = 0; - Size = 0x8000; + Size = 0x10000; ZwMapViewOfSection(SectionHandle, ShellHandle, &BaseAddress, 0, - 0x8000, + Size, &SectionOffset, &Size, 0,