From 44654617e3cf1c47359164a9ebd34accf8b63d31 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 30 Nov 2015 11:21:10 -0800 Subject: [PATCH] sys: WIP --- src/sys/device.c | 28 +--------------------------- src/sys/driver.h | 1 - src/sys/fsctl.c | 38 +++++++++++++++++++++----------------- 3 files changed, 22 insertions(+), 45 deletions(-) diff --git a/src/sys/device.c b/src/sys/device.c index c099fcc2..5fa64741 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -26,7 +26,6 @@ NTSTATUS FspDeviceCopyList( PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); VOID FspDeviceDeleteList( PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount); -NTSTATUS FspDeviceOwned(PDEVICE_OBJECT DeviceObject); VOID FspDeviceDeleteAll(VOID); #ifdef ALLOC_PRAGMA @@ -41,7 +40,6 @@ VOID FspDeviceDeleteAll(VOID); #pragma alloc_text(PAGE, FspFsvolDeviceFini) #pragma alloc_text(PAGE, FspDeviceCopyList) #pragma alloc_text(PAGE, FspDeviceDeleteList) -#pragma alloc_text(PAGE, FspDeviceOwned) #pragma alloc_text(PAGE, FspDeviceDeleteAll) #endif @@ -149,7 +147,7 @@ VOID FspDeviceDelete(PDEVICE_OBJECT DeviceObject) } ExDeleteResourceLite(&DeviceExtension->Resource); - RtlZeroMemory(DeviceExtension, DeviceObject->Size - sizeof DEVICE_OBJECT); + RtlZeroMemory(DeviceExtension, DeviceObject->Size - sizeof(DEVICE_OBJECT)); IoDeleteDevice(DeviceObject); } @@ -279,30 +277,6 @@ VOID FspDeviceDeleteList( ExFreePoolWithTag(DeviceObjects, FSP_TAG); } -NTSTATUS FspDeviceOwned(PDEVICE_OBJECT DeviceObject) -{ - PAGED_CODE(); - - NTSTATUS Result = STATUS_NO_SUCH_DEVICE; - PDEVICE_OBJECT *DeviceObjects = 0; - ULONG DeviceObjectCount = 0; - - Result = FspDeviceCopyList(&DeviceObjects, &DeviceObjectCount); - if (!NT_SUCCESS(Result)) - return Result; - - for (ULONG i = 0; DeviceObjectCount > i; i++) - if (DeviceObjects[i] == DeviceObject) - { - Result = STATUS_SUCCESS; - break; - } - - FspDeviceDeleteList(DeviceObjects, DeviceObjectCount); - - return Result; -} - VOID FspDeviceDeleteAll(VOID) { PAGED_CODE(); diff --git a/src/sys/driver.h b/src/sys/driver.h index c3fbbe3f..795bdb42 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -314,7 +314,6 @@ NTSTATUS FspDeviceCopyList( PDEVICE_OBJECT **PDeviceObjects, PULONG PDeviceObjectCount); VOID FspDeviceDeleteList( PDEVICE_OBJECT *DeviceObjects, ULONG DeviceObjectCount); -NTSTATUS FspDeviceOwned(PDEVICE_OBJECT DeviceObject); VOID FspDeviceDeleteAll(VOID); /* I/O processing */ diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index 8842a34b..09d8e3a5 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -177,6 +177,8 @@ static NTSTATUS FspFsctlMountVolume( ExAcquireResourceExclusiveLite(&FsctlDeviceExtension->Base.Resource, TRUE); try { + PDEVICE_OBJECT *DeviceObjects = 0; + ULONG DeviceObjectCount = 0; PVPB Vpb = IrpSp->Parameters.MountVolume.Vpb; PDEVICE_OBJECT FsvrtDeviceObject = Vpb->RealDevice; PDEVICE_OBJECT FsvolDeviceObject; @@ -185,25 +187,27 @@ static NTSTATUS FspFsctlMountVolume( FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension; /* check the passed in volume object; it must be one of our own and not marked Deleted */ - Result = FspDeviceOwned(FsvrtDeviceObject); + Result = FspDeviceCopyList(&DeviceObjects, &DeviceObjectCount); + if (NT_SUCCESS(Result)) + { + Result = STATUS_UNRECOGNIZED_VOLUME; + for (ULONG i = 0; DeviceObjectCount > i; i++) + if (DeviceObjects[i] == FsvrtDeviceObject) + { + if (FspDeviceRetain(FsvrtDeviceObject)) + { + if (!FsvrtDeviceExtension->Deleted && + FILE_DEVICE_VIRTUAL_DISK == FsvrtDeviceObject->DeviceType) + Result = STATUS_SUCCESS; + else + FspDeviceRelease(FsvrtDeviceObject); + } + break; + } + FspDeviceDeleteList(DeviceObjects, DeviceObjectCount); + } if (!NT_SUCCESS(Result)) - { - if (STATUS_NO_SUCH_DEVICE == Result) - Result = STATUS_UNRECOGNIZED_VOLUME; goto exit; - } - if (!FspDeviceRetain(FsvrtDeviceObject)) - { - Result = STATUS_UNRECOGNIZED_VOLUME; - goto exit; - } - if (FsvrtDeviceExtension->Deleted || - FILE_DEVICE_VIRTUAL_DISK != FsvrtDeviceObject->DeviceType) - { - FspDeviceRelease(FsvrtDeviceObject); - Result = STATUS_UNRECOGNIZED_VOLUME; - goto exit; - } /* create the file system device object */ Result = FspDeviceCreate(FspFsvolDeviceExtensionKind, 0,