Commit 38c82559 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

ntoskrnl.exe: Set FileObject of IRP passed to driver callbacks.

parent bb3f6842
...@@ -326,6 +326,7 @@ static NTSTATUS dispatch_create( const irp_params_t *params, void *in_buff, ULON ...@@ -326,6 +326,7 @@ static NTSTATUS dispatch_create( const irp_params_t *params, void *in_buff, ULON
irpsp = IoGetNextIrpStackLocation( irp ); irpsp = IoGetNextIrpStackLocation( irp );
irpsp->MajorFunction = IRP_MJ_CREATE; irpsp->MajorFunction = IRP_MJ_CREATE;
irpsp->DeviceObject = device; irpsp->DeviceObject = device;
irpsp->FileObject = file;
irpsp->Parameters.Create.SecurityContext = NULL; /* FIXME */ irpsp->Parameters.Create.SecurityContext = NULL; /* FIXME */
irpsp->Parameters.Create.Options = params->create.options; irpsp->Parameters.Create.Options = params->create.options;
irpsp->Parameters.Create.ShareAccess = params->create.sharing; irpsp->Parameters.Create.ShareAccess = params->create.sharing;
...@@ -370,6 +371,7 @@ static NTSTATUS dispatch_close( const irp_params_t *params, void *in_buff, ULONG ...@@ -370,6 +371,7 @@ static NTSTATUS dispatch_close( const irp_params_t *params, void *in_buff, ULONG
irpsp = IoGetNextIrpStackLocation( irp ); irpsp = IoGetNextIrpStackLocation( irp );
irpsp->MajorFunction = IRP_MJ_CLOSE; irpsp->MajorFunction = IRP_MJ_CLOSE;
irpsp->DeviceObject = device; irpsp->DeviceObject = device;
irpsp->FileObject = file;
irp->Tail.Overlay.OriginalFileObject = file; irp->Tail.Overlay.OriginalFileObject = file;
irp->RequestorMode = UserMode; irp->RequestorMode = UserMode;
...@@ -417,6 +419,7 @@ static NTSTATUS dispatch_read( const irp_params_t *params, void *in_buff, ULONG ...@@ -417,6 +419,7 @@ static NTSTATUS dispatch_read( const irp_params_t *params, void *in_buff, ULONG
irp->RequestorMode = UserMode; irp->RequestorMode = UserMode;
irpsp = IoGetNextIrpStackLocation( irp ); irpsp = IoGetNextIrpStackLocation( irp );
irpsp->FileObject = file;
irpsp->Parameters.Read.Key = params->read.key; irpsp->Parameters.Read.Key = params->read.key;
irp->Flags |= IRP_READ_OPERATION; irp->Flags |= IRP_READ_OPERATION;
...@@ -453,6 +456,7 @@ static NTSTATUS dispatch_write( const irp_params_t *params, void *in_buff, ULONG ...@@ -453,6 +456,7 @@ static NTSTATUS dispatch_write( const irp_params_t *params, void *in_buff, ULONG
irp->RequestorMode = UserMode; irp->RequestorMode = UserMode;
irpsp = IoGetNextIrpStackLocation( irp ); irpsp = IoGetNextIrpStackLocation( irp );
irpsp->FileObject = file;
irpsp->Parameters.Write.Key = params->write.key; irpsp->Parameters.Write.Key = params->write.key;
irp->Flags |= IRP_WRITE_OPERATION; irp->Flags |= IRP_WRITE_OPERATION;
...@@ -467,6 +471,7 @@ static NTSTATUS dispatch_flush( const irp_params_t *params, void *in_buff, ULONG ...@@ -467,6 +471,7 @@ static NTSTATUS dispatch_flush( const irp_params_t *params, void *in_buff, ULONG
ULONG out_size, HANDLE irp_handle ) ULONG out_size, HANDLE irp_handle )
{ {
IRP *irp; IRP *irp;
IO_STACK_LOCATION *irpsp;
DEVICE_OBJECT *device; DEVICE_OBJECT *device;
FILE_OBJECT *file = wine_server_get_ptr( params->flush.file ); FILE_OBJECT *file = wine_server_get_ptr( params->flush.file );
...@@ -483,6 +488,9 @@ static NTSTATUS dispatch_flush( const irp_params_t *params, void *in_buff, ULONG ...@@ -483,6 +488,9 @@ static NTSTATUS dispatch_flush( const irp_params_t *params, void *in_buff, ULONG
irp->Tail.Overlay.OriginalFileObject = file; irp->Tail.Overlay.OriginalFileObject = file;
irp->RequestorMode = UserMode; irp->RequestorMode = UserMode;
irpsp = IoGetNextIrpStackLocation( irp );
irpsp->FileObject = file;
dispatch_irp( device, irp, irp_handle ); dispatch_irp( device, irp, irp_handle );
HeapFree( GetProcessHeap(), 0, in_buff ); HeapFree( GetProcessHeap(), 0, in_buff );
...@@ -493,6 +501,7 @@ static NTSTATUS dispatch_flush( const irp_params_t *params, void *in_buff, ULONG ...@@ -493,6 +501,7 @@ static NTSTATUS dispatch_flush( const irp_params_t *params, void *in_buff, ULONG
static NTSTATUS dispatch_ioctl( const irp_params_t *params, void *in_buff, ULONG in_size, static NTSTATUS dispatch_ioctl( const irp_params_t *params, void *in_buff, ULONG in_size,
ULONG out_size, HANDLE irp_handle ) ULONG out_size, HANDLE irp_handle )
{ {
IO_STACK_LOCATION *irpsp;
IRP *irp; IRP *irp;
void *out_buff = NULL; void *out_buff = NULL;
void *to_free = NULL; void *to_free = NULL;
...@@ -540,6 +549,9 @@ static NTSTATUS dispatch_ioctl( const irp_params_t *params, void *in_buff, ULONG ...@@ -540,6 +549,9 @@ static NTSTATUS dispatch_ioctl( const irp_params_t *params, void *in_buff, ULONG
if (out_size && (params->ioctl.code & 3) != METHOD_BUFFERED) if (out_size && (params->ioctl.code & 3) != METHOD_BUFFERED)
HeapReAlloc( GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, in_buff, in_size ); HeapReAlloc( GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, in_buff, in_size );
irpsp = IoGetNextIrpStackLocation( irp );
irpsp->FileObject = file;
irp->Tail.Overlay.OriginalFileObject = file; irp->Tail.Overlay.OriginalFileObject = file;
irp->RequestorMode = UserMode; irp->RequestorMode = UserMode;
irp->AssociatedIrp.SystemBuffer = in_buff; irp->AssociatedIrp.SystemBuffer = in_buff;
......
...@@ -183,6 +183,18 @@ todo_wine ...@@ -183,6 +183,18 @@ todo_wine
ok(current != NULL, "Expected current process to be non-NULL\n"); ok(current != NULL, "Expected current process to be non-NULL\n");
} }
static FILE_OBJECT *last_created_file;
static void test_irp_struct(IRP *irp, DEVICE_OBJECT *device)
{
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp );
ok(last_created_file != NULL, "last_created_file = NULL\n");
ok(irpsp->FileObject == last_created_file, "FileObject != last_created_file\n");
ok(irpsp->DeviceObject == device, "unexpected DeviceObject\n");
ok(irpsp->FileObject->DeviceObject == device, "unexpected FileObject->DeviceObject\n");
}
static void test_mdl_map(void) static void test_mdl_map(void)
{ {
char buffer[20] = "test buffer"; char buffer[20] = "test buffer";
...@@ -604,7 +616,7 @@ static void test_lookaside_list(void) ...@@ -604,7 +616,7 @@ static void test_lookaside_list(void)
ExDeleteNPagedLookasideList(&list); ExDeleteNPagedLookasideList(&list);
} }
static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info) static NTSTATUS main_test(DEVICE_OBJECT *device, IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
{ {
ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength; ULONG length = stack->Parameters.DeviceIoControl.OutputBufferLength;
void *buffer = irp->AssociatedIrp.SystemBuffer; void *buffer = irp->AssociatedIrp.SystemBuffer;
...@@ -628,6 +640,7 @@ static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info) ...@@ -628,6 +640,7 @@ static NTSTATUS main_test(IRP *irp, IO_STACK_LOCATION *stack, ULONG_PTR *info)
attr.Attributes = OBJ_KERNEL_HANDLE; /* needed to be accessible from system threads */ attr.Attributes = OBJ_KERNEL_HANDLE; /* needed to be accessible from system threads */
ZwOpenFile(&okfile, FILE_APPEND_DATA | SYNCHRONIZE, &attr, &io, 0, FILE_SYNCHRONOUS_IO_NONALERT); ZwOpenFile(&okfile, FILE_APPEND_DATA | SYNCHRONIZE, &attr, &io, 0, FILE_SYNCHRONOUS_IO_NONALERT);
test_irp_struct(irp, device);
test_currentprocess(); test_currentprocess();
test_mdl_map(); test_mdl_map();
test_init_funcs(); test_init_funcs();
...@@ -686,6 +699,10 @@ static NTSTATUS test_load_driver_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG ...@@ -686,6 +699,10 @@ static NTSTATUS test_load_driver_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG
static NTSTATUS WINAPI driver_Create(DEVICE_OBJECT *device, IRP *irp) static NTSTATUS WINAPI driver_Create(DEVICE_OBJECT *device, IRP *irp)
{ {
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp );
last_created_file = irpsp->FileObject;
irp->IoStatus.Status = STATUS_SUCCESS; irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(irp, IO_NO_INCREMENT); IoCompleteRequest(irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; return STATUS_SUCCESS;
...@@ -702,7 +719,7 @@ static NTSTATUS WINAPI driver_IoControl(DEVICE_OBJECT *device, IRP *irp) ...@@ -702,7 +719,7 @@ static NTSTATUS WINAPI driver_IoControl(DEVICE_OBJECT *device, IRP *irp)
status = test_basic_ioctl(irp, stack, &irp->IoStatus.Information); status = test_basic_ioctl(irp, stack, &irp->IoStatus.Information);
break; break;
case IOCTL_WINETEST_MAIN_TEST: case IOCTL_WINETEST_MAIN_TEST:
status = main_test(irp, stack, &irp->IoStatus.Information); status = main_test(device, irp, stack, &irp->IoStatus.Information);
break; break;
case IOCTL_WINETEST_LOAD_DRIVER: case IOCTL_WINETEST_LOAD_DRIVER:
status = test_load_driver_ioctl(irp, stack, &irp->IoStatus.Information); status = test_load_driver_ioctl(irp, stack, &irp->IoStatus.Information);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment