From 9a068f8b4b0508cdba5c2eb9acfe930e73050dbc Mon Sep 17 00:00:00 2001 From: David Welch Date: Thu, 28 Jan 1999 21:41:05 +0000 Subject: [PATCH] Removed memory leaks Fixed bug in console driver (wasn't completing irp) svn path=/trunk/; revision=194 --- reactos/apps/utils/shell/shell.c | 2 + reactos/drivers/dd/blue/blues.c | 2 +- reactos/ntoskrnl/io/buildirp.c | 80 +++++++++++++------------------- reactos/ntoskrnl/io/create.c | 13 ++++-- reactos/ntoskrnl/io/dir.c | 3 -- reactos/ntoskrnl/io/irp.c | 31 +++++-------- reactos/ntoskrnl/io/rw.c | 19 ++------ reactos/ntoskrnl/ke/timer.c | 2 +- reactos/ntoskrnl/ldr/loader.c | 3 +- reactos/ntoskrnl/mm/npool.c | 2 +- reactos/ntoskrnl/mm/virtual.c | 15 ++++-- reactos/ntoskrnl/ob/namespc.c | 14 +++--- 12 files changed, 82 insertions(+), 104 deletions(-) diff --git a/reactos/apps/utils/shell/shell.c b/reactos/apps/utils/shell/shell.c index 8a3642fa179..3f2749aa424 100644 --- a/reactos/apps/utils/shell/shell.c +++ b/reactos/apps/utils/shell/shell.c @@ -75,6 +75,7 @@ void ExecuteDir(char* cmdline) debug_printf("%s\n",FindData.cFileName); } while(FindNextFile(shandle,&FindData)); debug_printf("\n %d files\n %d directories\n\n",nFile,nRep); + FindClose(shandle); } void ExecuteType(char* cmdline) @@ -99,6 +100,7 @@ void ExecuteType(char* cmdline) debug_printf("%c",c); c = 0; } + CloseHandle(FileHandle); } int ExecuteProcess(char* name, char* cmdline) diff --git a/reactos/drivers/dd/blue/blues.c b/reactos/drivers/dd/blue/blues.c index 4eef10d50f8..7103cd2d149 100644 --- a/reactos/drivers/dd/blue/blues.c +++ b/reactos/drivers/dd/blue/blues.c @@ -71,7 +71,7 @@ NTSTATUS ScrDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) break; } - + IoCompleteRequest(Irp, Status); // DPRINT("Status %d\n",Status); return(Status); } diff --git a/reactos/ntoskrnl/io/buildirp.c b/reactos/ntoskrnl/io/buildirp.c index 1f422162b85..0da2c8debaf 100644 --- a/reactos/ntoskrnl/io/buildirp.c +++ b/reactos/ntoskrnl/io/buildirp.c @@ -20,31 +20,45 @@ NTSTATUS IoPrepareIrpBuffer(PIRP Irp, PDEVICE_OBJECT DeviceObject, PVOID Buffer, - PVOID Length) + ULONG Length, + ULONG MajorFunction) /* * FUNCTION: Prepares the buffer to be used for an IRP */ { - Irp->UserBuffer = (LPVOID)Buffer; - if (DeviceObject->Flags&DO_BUFFERED_IO) + Irp->UserBuffer = Buffer; + 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); + ExAllocatePool(NonPagedPool,Length); if (Irp->AssociatedIrp.SystemBuffer==NULL) { - return(STATUS_UNSUCCESSFUL); + IoFreeIrp(Irp); + return(NULL); } + /* FIXME: should copy buffer in on other ops */ + if (MajorFunction == IRP_MJ_WRITE) + { + RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length); + } } - if (DeviceObject->Flags&DO_DIRECT_IO) + 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); - MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess); + if (MajorFunction == IRP_MJ_READ) + { + MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess); + } + else + { + MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoReadAccess); + } Irp->UserBuffer = NULL; Irp->AssociatedIrp.SystemBuffer = NULL; - } + } return(STATUS_SUCCESS); } @@ -236,41 +250,8 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, return(NULL); } - Irp->UserBuffer = (LPVOID)Buffer; Irp->UserEvent = Event; Irp->UserIosb = IoStatusBlock; - if (DeviceObject->Flags & DO_BUFFERED_IO) - { - DPRINT("Doing buffer i/o\n"); - Irp->AssociatedIrp.SystemBuffer = (PVOID) - ExAllocatePool(NonPagedPool,Length); - if (Irp->AssociatedIrp.SystemBuffer==NULL) - { - IoFreeIrp(Irp); - return(NULL); - } - /* FIXME: should copy buffer in on other ops */ - if (MajorFunction == IRP_MJ_WRITE) - { - RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, Buffer, Length); - } - } - if (DeviceObject->Flags & DO_DIRECT_IO) - { - DPRINT("Doing direct i/o\n"); - - Irp->MdlAddress = MmCreateMdl(NULL,Buffer,Length); - if (MajorFunction == IRP_MJ_READ) - { - MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoWriteAccess); - } - else - { - MmProbeAndLockPages(Irp->MdlAddress,UserMode,IoReadAccess); - } - Irp->UserBuffer = NULL; - Irp->AssociatedIrp.SystemBuffer = NULL; - } StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->MajorFunction = MajorFunction; @@ -280,14 +261,17 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, StackPtr->DeviceObject = DeviceObject; StackPtr->FileObject = NULL; StackPtr->CompletionRoutine = NULL; - StackPtr->Parameters.Write.Length = Length; + + IoPrepareIrpBuffer(Irp, + DeviceObject, + Buffer, + Length, + MajorFunction); + if (MajorFunction == IRP_MJ_READ) { if (StartingOffset != NULL) { - DPRINT("StartingOffset:%ld:%ld\n", - GET_LARGE_INTEGER_HIGH_PART(*StartingOffset), - GET_LARGE_INTEGER_LOW_PART(*StartingOffset)); StackPtr->Parameters.Read.ByteOffset = *StartingOffset; } else @@ -297,6 +281,7 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Read.ByteOffset, 0); } + StackPtr->Parameters.Read.Length = Length; } else { @@ -311,6 +296,7 @@ PIRP IoBuildSynchronousFsdRequest(ULONG MajorFunction, SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Write.ByteOffset, 0); } + StackPtr->Parameters.Write.Length = Length; } return(Irp); diff --git a/reactos/ntoskrnl/io/create.c b/reactos/ntoskrnl/io/create.c index cb2fb56828d..48cdb5187fd 100644 --- a/reactos/ntoskrnl/io/create.c +++ b/reactos/ntoskrnl/io/create.c @@ -100,16 +100,19 @@ NTSTATUS ZwCreateFile(PHANDLE FileHandle, PIO_STACK_LOCATION StackLoc; PWSTR Remainder; - DPRINT("ZwCreateFile(FileHandle %x, DesiredAccess %x, " - "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %w)\n", - FileHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes->ObjectName->Buffer); + DbgPrint("ZwCreateFile(FileHandle %x, DesiredAccess %x, " + "ObjectAttributes %x ObjectAttributes->ObjectName->Buffer %w)\n", + FileHandle,DesiredAccess,ObjectAttributes, + ObjectAttributes->ObjectName->Buffer); assert_irql(PASSIVE_LEVEL); *FileHandle=0; - FileObject = ObGenericCreateObject(FileHandle,DesiredAccess,NULL,IoFileType); + FileObject = ObGenericCreateObject(FileHandle, + DesiredAccess, + NULL, + IoFileType); memset(FileObject,0,sizeof(FILE_OBJECT)); Status = ObOpenObjectByName(ObjectAttributes,&Object,&Remainder); diff --git a/reactos/ntoskrnl/io/dir.c b/reactos/ntoskrnl/io/dir.c index 44741837523..a7e9cad13a6 100644 --- a/reactos/ntoskrnl/io/dir.c +++ b/reactos/ntoskrnl/io/dir.c @@ -179,10 +179,7 @@ NTSTATUS STDCALL ZwQueryDirectoryFile( } if (ReturnSingleEntry) { - DPRINT("Setting ReturingSingleEntry flag\n"); IoStack->Flags = IoStack->Flags | SL_RETURN_SINGLE_ENTRY; - DPRINT("SL_RETURN_SINGLE_ENTRY %x\n",SL_RETURN_SINGLE_ENTRY); - DPRINT("IoStack->Flags %x\n",IoStack->Flags); } if (((PFILE_DIRECTORY_INFORMATION)FileInformation)->FileIndex != 0) { diff --git a/reactos/ntoskrnl/io/irp.c b/reactos/ntoskrnl/io/irp.c index 40f08370fd1..0006187aa1f 100644 --- a/reactos/ntoskrnl/io/irp.c +++ b/reactos/ntoskrnl/io/irp.c @@ -160,26 +160,20 @@ PIO_STACK_LOCATION IoGetNextIrpStackLocation(PIRP Irp) return(&Irp->Stack[Irp->CurrentLocation-1]); } -NTSTATUS IoCallDriver(PDEVICE_OBJECT DevObject, PIRP irp) +NTSTATUS IoCallDriver(PDEVICE_OBJECT DeviceObject, PIRP Irp) /* * FUNCTION: Sends an IRP to the next lower driver */ { NTSTATUS Status; - PDRIVER_OBJECT drv = DevObject->DriverObject; - IO_STACK_LOCATION* param = IoGetNextIrpStackLocation(irp); + PDRIVER_OBJECT DriverObject = DeviceObject->DriverObject; + PIO_STACK_LOCATION param = IoGetNextIrpStackLocation(Irp); - DPRINT("Deviceobject %x\n",DevObject); - DPRINT("Irp %x\n",irp); + Irp->Tail.Overlay.CurrentStackLocation--; + Irp->CurrentLocation--; - irp->Tail.Overlay.CurrentStackLocation--; - irp->CurrentLocation--; - - DPRINT("Io stack address %x\n",param); - DPRINT("Function %d Routine %x\n",param->MajorFunction, - drv->MajorFunction[param->MajorFunction]); - - Status = drv->MajorFunction[param->MajorFunction](DevObject,irp); + Status = DriverObject->MajorFunction[param->MajorFunction](DeviceObject, + Irp); return Status; } @@ -193,11 +187,13 @@ PIRP IoAllocateIrp(CCHAR StackSize, BOOLEAN ChargeQuota) */ { PIRP Irp; - + +#if 0 DbgPrint("IoAllocateIrp(StackSize %d ChargeQuota %d)\n", StackSize, ChargeQuota); KeDumpStackFrames(0,8); +#endif if (ChargeQuota) { @@ -269,13 +265,10 @@ VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) NTSTATUS Status; DPRINT("IoCompleteRequest(Irp %x, PriorityBoost %d)\n", - Irp,PriorityBoost); + Irp,PriorityBoost); for (i=0;iStackCount;i++) { - DPRINT("&Irp->Stack[%d].CompletionRoutine %08lx\n", - i, - Irp->Stack[i].CompletionRoutine); if (Irp->Stack[i].CompletionRoutine != NULL) { Status = Irp->Stack[i].CompletionRoutine( @@ -287,10 +280,8 @@ VOID IoCompleteRequest(PIRP Irp, CCHAR PriorityBoost) return; } } - DPRINT("Irp->Stack[%d].Control %08lx\n", i, Irp->Stack[i].Control); if (Irp->Stack[i].Control & SL_PENDING_RETURNED) { - DPRINT("Setting PendingReturned flag\n"); Irp->PendingReturned = TRUE; } } diff --git a/reactos/ntoskrnl/io/rw.c b/reactos/ntoskrnl/io/rw.c index 344e49866d7..4e963a3780d 100644 --- a/reactos/ntoskrnl/io/rw.c +++ b/reactos/ntoskrnl/io/rw.c @@ -3,7 +3,7 @@ * PROJECT: ReactOS kernel * FILE: ntoskrnl/io/rw.c * PURPOSE: Implements read/write APIs - * PROGRAMMER: David Welch (welch@mcmail.com) + * PROGRAMMER: David Welch (welch@cwcom.net) * UPDATE HISTORY: * 30/05/98: Created */ @@ -72,11 +72,8 @@ NTSTATUS ZwReadFile(HANDLE FileHandle, NULL); if (Status != STATUS_SUCCESS) { - DPRINT("ZwReadFile() ="); -// DbgPrintErrorMessage(Status); return(Status); } - assert(FileObject != NULL); if (ByteOffset==NULL) { @@ -110,6 +107,7 @@ NTSTATUS ZwReadFile(HANDLE FileHandle, KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); return(IoStatusBlock->Status); } + ObDereferenceObject(FileObject); return(Status); } @@ -176,16 +174,6 @@ NTSTATUS ZwWriteFile(HANDLE FileHandle, DPRINT("FileObject->DeviceObject %x\n",FileObject->DeviceObject); StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->FileObject = FileObject; - StackPtr->Parameters.Write.Length = Length; - if (ByteOffset!=NULL) - { - StackPtr->Parameters.Write.ByteOffset = *ByteOffset; - } - else - { - SET_LARGE_INTEGER_LOW_PART(StackPtr->Parameters.Write.ByteOffset, 0); - SET_LARGE_INTEGER_HIGH_PART(StackPtr->Parameters.Write.ByteOffset, 0); - } if (Key!=NULL) { StackPtr->Parameters.Write.Key = *Key; @@ -200,7 +188,8 @@ NTSTATUS ZwWriteFile(HANDLE FileHandle, KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL); Status = Irp->IoStatus.Status; } - + ObDereferenceObject(FileObject); + return(Status); } diff --git a/reactos/ntoskrnl/ke/timer.c b/reactos/ntoskrnl/ke/timer.c index 11678649ee7..bae22e9bf35 100644 --- a/reactos/ntoskrnl/ke/timer.c +++ b/reactos/ntoskrnl/ke/timer.c @@ -532,7 +532,7 @@ BOOLEAN KiTimerInterrupt(VOID) } // sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,ticks); memset(str, 0, sizeof(str)); - sprintf(str,"%.8u %.8u",EiNrUsedBlocks,KiTimerTicks); + sprintf(str,"%.8u %.8u",EiNrUsedBlocks,EiFreeNonPagedPool); // sprintf(str,"%.8u %.8u",EiFreeNonPagedPool,EiUsedNonPagedPool); // sprintf(str,"%.8u %.8u",PiNrThreads,KiTimerTicks); for (i=0;i<17;i++) diff --git a/reactos/ntoskrnl/ldr/loader.c b/reactos/ntoskrnl/ldr/loader.c index 65f1209fe40..35a31139e53 100644 --- a/reactos/ntoskrnl/ldr/loader.c +++ b/reactos/ntoskrnl/ldr/loader.c @@ -1037,7 +1037,8 @@ LdrProcessPEImage(HANDLE ProcessHandle, PIMAGE_NT_HEADERS NTHeaders; PMODULE Module; LARGE_INTEGER SectionOffset; - + HANDLE SectionHandle; + /* Allocate memory for headers */ Module = HEADER_TO_BODY(ModuleHandle); if (Module == NULL) diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index b289e51d2ad..039fc83dfa6 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -34,7 +34,7 @@ #define VALIDATE_POOL #endif -#if 1 +#if 0 #define POOL_TRACE(args...) do { DbgPrint(args); } while(0); #else #define POOL_TRACE(args...) diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index 686ec728f79..3df1b75481b 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -455,7 +455,6 @@ NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle, NULL); if (Status != STATUS_SUCCESS) { - DbgPrint("ZwFreeVirtualMemory() = %x\n",Status); return(Status); } @@ -465,8 +464,9 @@ NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle, return(STATUS_UNSUCCESSFUL); } - if (FreeType == MEM_RELEASE) + switch (FreeType) { + case MEM_RELEASE: if (MemoryArea->BaseAddress != (*BaseAddress)) { return(STATUS_UNSUCCESSFUL); @@ -476,9 +476,18 @@ NTSTATUS STDCALL ZwFreeVirtualMemory(IN HANDLE ProcessHandle, 0, TRUE); return(STATUS_SUCCESS); + + case MEM_DECOMMIT: + MmSplitMemoryArea(PsGetCurrentProcess(), + MemoryArea, + *BaseAddress, + *RegionSize, + MEMORY_AREA_RESERVE, + MemoryArea->Attributes); + return(STATUS_SUCCESS); } - UNIMPLEMENTED; + return(STATUS_NOT_IMPLEMENTED); } NTSTATUS STDCALL NtLockVirtualMemory(HANDLE ProcessHandle, diff --git a/reactos/ntoskrnl/ob/namespc.c b/reactos/ntoskrnl/ob/namespc.c index 3bfbcf46105..d36cffcbc44 100644 --- a/reactos/ntoskrnl/ob/namespc.c +++ b/reactos/ntoskrnl/ob/namespc.c @@ -432,12 +432,11 @@ VOID ObCreateEntry(PDIRECTORY_OBJECT parent,POBJECT_HEADER Object) InsertTailList(&parent->head,&Object->Entry); } -NTSTATUS -ObLookupObject(HANDLE rootdir, - PWSTR string, - PVOID* Object, - PWSTR* UnparsedSection, - ULONG Attributes) +NTSTATUS ObLookupObject(HANDLE rootdir, + PWSTR string, + PVOID* Object, + PWSTR* UnparsedSection, + ULONG Attributes) /* * FUNCTION: Lookup an object within the system namespc * ARGUMENTS: @@ -550,7 +549,8 @@ ObLookupObject(HANDLE rootdir, current_dir = BODY_TO_HEADER(current_dir)->ObjectType-> Parse(current_dir, UnparsedSection); - Status = (current_dir != NULL) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL; + Status = (current_dir != NULL) ? STATUS_SUCCESS : + STATUS_UNSUCCESSFUL; } else {