Jacek Caban : ntoskrnl.exe: Reuse IRP input buffer if it wasn't used.

Alexandre Julliard julliard at winehq.org
Mon May 27 14:50:19 CDT 2019


Module: wine
Branch: master
Commit: 0138da5025a117bc598f85b98b644ec0820255c3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0138da5025a117bc598f85b98b644ec0820255c3

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon May 27 13:38:59 2019 +0200

ntoskrnl.exe: Reuse IRP input buffer if it wasn't used.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index c355c88..c9b56b7 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -633,7 +633,6 @@ static NTSTATUS dispatch_create( struct dispatch_context *context )
     irp->Flags |= IRP_CREATE_OPERATION;
     dispatch_irp( device, irp, context );
 
-    HeapFree( GetProcessHeap(), 0, context->in_buff );
     return STATUS_SUCCESS;
 }
 
@@ -671,7 +670,6 @@ static NTSTATUS dispatch_close( struct dispatch_context *context )
     irp->Flags |= IRP_CLOSE_OPERATION;
     dispatch_irp( device, irp, context );
 
-    HeapFree( GetProcessHeap(), 0, context->in_buff );
     return STATUS_SUCCESS;
 }
 
@@ -714,7 +712,6 @@ static NTSTATUS dispatch_read( struct dispatch_context *context )
     irp->Flags |= IRP_DEALLOCATE_BUFFER;  /* deallocate out_buff */
     dispatch_irp( device, irp, context );
 
-    HeapFree( GetProcessHeap(), 0, context->in_buff );
     return STATUS_SUCCESS;
 }
 
@@ -738,6 +735,7 @@ static NTSTATUS dispatch_write( struct dispatch_context *context )
     if (!(irp = IoBuildSynchronousFsdRequest( IRP_MJ_WRITE, device, context->in_buff, context->in_size,
                                               &offset, NULL, NULL )))
         return STATUS_NO_MEMORY;
+    context->in_buff = NULL;
 
     irp->Tail.Overlay.OriginalFileObject = file;
     irp->RequestorMode = UserMode;
@@ -779,7 +777,6 @@ static NTSTATUS dispatch_flush( struct dispatch_context *context )
 
     dispatch_irp( device, irp, context );
 
-    HeapFree( GetProcessHeap(), 0, context->in_buff );
     return STATUS_SUCCESS;
 }
 
@@ -841,6 +838,7 @@ static NTSTATUS dispatch_ioctl( struct dispatch_context *context )
     irp->Tail.Overlay.OriginalFileObject = file;
     irp->RequestorMode = UserMode;
     irp->AssociatedIrp.SystemBuffer = context->in_buff;
+    context->in_buff = NULL;
 
     irp->Flags |= IRP_DEALLOCATE_BUFFER;  /* deallocate in_buff */
     dispatch_irp( device, irp, context );
@@ -981,8 +979,7 @@ NTSTATUS CDECL wine_ntoskrnl_main_loop( HANDLE stop_event )
             if (status == STATUS_SUCCESS)
             {
                 context.handle = 0;  /* status reported by IoCompleteRequest */
-                context.in_size = 4096;
-                context.in_buff = NULL;
+                if (!context.in_buff) context.in_size = 4096;
             }
             break;
         case STATUS_BUFFER_OVERFLOW:




More information about the wine-cvs mailing list