📄 disk.c
字号:
/*++
Copyright (C) Microsoft Corporation, 1991 - 1999
Module Name:
disk.c
Abstract:
SCSI disk class driver
Environment:
kernel mode only
Notes:
Revision History:
--*/
#include "disk.h"
//
// Now instantiate the GUIDs
//
#include "initguid.h"
#include "ntddstor.h"
#include "ntddvol.h"
#include "ioevent.h"
NTSTATUS
DiskDetermineMediaTypes(
IN PDEVICE_OBJECT Fdo,
IN PIRP Irp,
IN UCHAR MediumType,
IN UCHAR DensityCode,
IN BOOLEAN MediaPresent,
IN BOOLEAN IsWritable
);
PPARTITION_INFORMATION_EX
DiskPdoFindPartitionEntry(
IN PPHYSICAL_DEVICE_EXTENSION Pdo,
IN PDRIVE_LAYOUT_INFORMATION_EX LayoutInfo
);
PPARTITION_INFORMATION_EX
DiskFindAdjacentPartition(
IN PDRIVE_LAYOUT_INFORMATION_EX LayoutInfo,
IN PPARTITION_INFORMATION_EX BasePartition
);
PPARTITION_INFORMATION_EX
DiskFindContainingPartition(
IN PDRIVE_LAYOUT_INFORMATION_EX LayoutInfo,
IN PPARTITION_INFORMATION_EX BasePartition,
IN BOOLEAN SearchTopToBottom
);
NTSTATUS
DiskIoctlCreateDisk(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlGetDriveLayout(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlGetDriveLayoutEx(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlSetDriveLayout(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlSetDriveLayoutEx(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlGetPartitionInfo(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlGetPartitionInfoEx(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlGetLengthInfo(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlSetPartitionInfo(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlSetPartitionInfoEx(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlSetPartitionInfoEx(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DiskIoctlGetDriveGeometryEx(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, DiskUnload)
#pragma alloc_text(PAGE, DiskCreateFdo)
#pragma alloc_text(PAGE, DiskDetermineMediaTypes)
#pragma alloc_text(PAGE, DiskShutdownFlush)
#pragma alloc_text(PAGE, DiskFlushDispatch)
#pragma alloc_text(PAGE, DiskModeSelect)
#pragma alloc_text(PAGE, DisableWriteCache)
#pragma alloc_text(PAGE, DiskIoctlVerify)
#pragma alloc_text(PAGE, DiskSetSpecialHacks)
#pragma alloc_text(PAGE, DiskQueryPnpCapabilities)
#pragma alloc_text(PAGE, DiskGetCacheInformation)
#pragma alloc_text(PAGE, DiskSetCacheInformation)
#pragma alloc_text(PAGE, DiskLogCacheInformation)
#pragma alloc_text(PAGE, DiskSetInfoExceptionInformation)
#pragma alloc_text(PAGE, DiskGetInfoExceptionInformation)
#pragma alloc_text(PAGE, DiskPdoFindPartitionEntry)
#pragma alloc_text(PAGE, DiskFindAdjacentPartition)
#pragma alloc_text(PAGE, DiskFindContainingPartition)
#pragma alloc_text(PAGE, DiskIoctlCreateDisk)
#pragma alloc_text(PAGE, DiskIoctlGetDriveLayout)
#pragma alloc_text(PAGE, DiskIoctlGetDriveLayoutEx)
#pragma alloc_text(PAGE, DiskIoctlSetDriveLayout)
#pragma alloc_text(PAGE, DiskIoctlSetDriveLayoutEx)
#pragma alloc_text(PAGE, DiskIoctlGetPartitionInfo)
#pragma alloc_text(PAGE, DiskIoctlGetPartitionInfoEx)
#pragma alloc_text(PAGE, DiskIoctlGetLengthInfo)
#pragma alloc_text(PAGE, DiskIoctlSetPartitionInfo)
#pragma alloc_text(PAGE, DiskIoctlSetPartitionInfoEx)
#pragma alloc_text(PAGE, DiskIoctlGetDriveGeometryEx)
#endif
extern ULONG DiskDisableGpt;
const GUID GUID_NULL = { 0 };
#define DiskCompareGuid(_First,_Second) \
(memcmp ((_First),(_Second), sizeof (GUID)))
//
// This macro is used to work around a bug in the definition of
// DISK_CACHE_RETENTION_PRIORITY. The value KeepReadData should be
// assigned 0xf rather than 0x2. Since the interface was already published
// when this was discovered the disk driver has been modified to translate
// between the interface value and the correct scsi value.
//
// 0x2 is turned into 0xf
// 0xf is turned into 0x2 - this ensures that future SCSI defintions can be
// accomodated.
//
#define TRANSLATE_RETENTION_PRIORITY(_x)\
((_x) == 0xf ? 0x2 : \
((_x) == 0x2 ? 0xf : _x) \
)
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS_ADMIN CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_READ_ACCESS)
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
/*++
Routine Description:
This routine initializes the SCSI hard disk class driver.
Arguments:
DriverObject - Pointer to driver object created by system.
RegistryPath - Pointer to the name of the services node for this driver.
Return Value:
The function value is the final status from the initialization operation.
--*/
{
CLASS_INIT_DATA InitializationData = { 0 };
CLASS_QUERY_WMI_REGINFO_EX_LIST classQueryWmiRegInfoExList = { 0 };
GUID guidQueryRegInfoEx = GUID_CLASSPNP_QUERY_REGINFOEX;
NTSTATUS status;
#if defined(_X86_) || defined(_AMD64_)
//
// Read the information NtDetect squirreled away about the disks in this
// system.
//
DiskSaveDetectInfo(DriverObject);
#endif
InitializationData.InitializationDataSize = sizeof(CLASS_INIT_DATA);
//
// Setup sizes and entry points for functional device objects
//
InitializationData.FdoData.DeviceExtensionSize = FUNCTIONAL_EXTENSION_SIZE;
InitializationData.FdoData.DeviceType = FILE_DEVICE_DISK;
InitializationData.FdoData.DeviceCharacteristics = FILE_DEVICE_SECURE_OPEN;
InitializationData.FdoData.ClassInitDevice = DiskInitFdo;
InitializationData.FdoData.ClassStartDevice = DiskStartFdo;
InitializationData.FdoData.ClassStopDevice = DiskStopDevice;
InitializationData.FdoData.ClassRemoveDevice = DiskRemoveDevice;
InitializationData.FdoData.ClassPowerDevice = ClassSpinDownPowerHandler;
InitializationData.FdoData.ClassError = DiskFdoProcessError;
InitializationData.FdoData.ClassReadWriteVerification = DiskReadWriteVerification;
InitializationData.FdoData.ClassDeviceControl = DiskDeviceControl;
InitializationData.FdoData.ClassShutdownFlush = DiskShutdownFlush;
InitializationData.FdoData.ClassCreateClose = NULL;
//
// Setup sizes and entry points for physical device objects
//
InitializationData.PdoData.DeviceExtensionSize = PHYSICAL_EXTENSION_SIZE;
InitializationData.PdoData.DeviceType = FILE_DEVICE_DISK;
InitializationData.PdoData.DeviceCharacteristics = FILE_DEVICE_SECURE_OPEN;
InitializationData.PdoData.ClassInitDevice = DiskInitPdo;
InitializationData.PdoData.ClassStartDevice = DiskStartPdo;
InitializationData.PdoData.ClassStopDevice = DiskStopDevice;
InitializationData.PdoData.ClassRemoveDevice = DiskRemoveDevice;
//
// Use default power routine for PDOs
//
InitializationData.PdoData.ClassPowerDevice = NULL;
InitializationData.PdoData.ClassError = NULL;
InitializationData.PdoData.ClassReadWriteVerification = DiskReadWriteVerification;
InitializationData.PdoData.ClassDeviceControl = DiskDeviceControl;
InitializationData.PdoData.ClassShutdownFlush = DiskShutdownFlush;
InitializationData.PdoData.ClassCreateClose = NULL;
InitializationData.PdoData.ClassQueryPnpCapabilities = DiskQueryPnpCapabilities;
InitializationData.ClassAddDevice = DiskAddDevice;
InitializationData.ClassEnumerateDevice = DiskEnumerateDevice;
InitializationData.ClassQueryId = DiskQueryId;
InitializationData.FdoData.ClassWmiInfo.GuidCount = 7;
InitializationData.FdoData.ClassWmiInfo.GuidRegInfo = DiskWmiFdoGuidList;
InitializationData.FdoData.ClassWmiInfo.ClassQueryWmiRegInfo = DiskFdoQueryWmiRegInfo;
InitializationData.FdoData.ClassWmiInfo.ClassQueryWmiDataBlock = DiskFdoQueryWmiDataBlock;
InitializationData.FdoData.ClassWmiInfo.ClassSetWmiDataBlock = DiskFdoSetWmiDataBlock;
InitializationData.FdoData.ClassWmiInfo.ClassSetWmiDataItem = DiskFdoSetWmiDataItem;
InitializationData.FdoData.ClassWmiInfo.ClassExecuteWmiMethod = DiskFdoExecuteWmiMethod;
InitializationData.FdoData.ClassWmiInfo.ClassWmiFunctionControl = DiskWmiFunctionControl;
#if 0
//
// Enable this to add WMI support for PDOs
InitializationData.PdoData.ClassWmiInfo.GuidCount = 1;
InitializationData.PdoData.ClassWmiInfo.GuidRegInfo = DiskWmiPdoGuidList;
InitializationData.PdoData.ClassWmiInfo.ClassQueryWmiRegInfo = DiskPdoQueryWmiRegInfo;
InitializationData.PdoData.ClassWmiInfo.ClassQueryWmiDataBlock = DiskPdoQueryWmiDataBlock;
InitializationData.PdoData.ClassWmiInfo.ClassSetWmiDataBlock = DiskPdoSetWmiDataBlock;
InitializationData.PdoData.ClassWmiInfo.ClassSetWmiDataItem = DiskPdoSetWmiDataItem;
InitializationData.PdoData.ClassWmiInfo.ClassExecuteWmiMethod = DiskPdoExecuteWmiMethod;
InitializationData.PdoData.ClassWmiInfo.ClassWmiFunctionControl = DiskWmiFunctionControl;
#endif
InitializationData.ClassUnload = DiskUnload;
//
// Initialize regregistration data structures
//
DiskInitializeReregistration();
//
// Call the class init routine
//
status = ClassInitialize(DriverObject, RegistryPath, &InitializationData);
#if defined(_X86_) || defined(_AMD64_)
if(NT_SUCCESS(status)) {
IoRegisterBootDriverReinitialization(DriverObject,
DiskDriverReinitialization,
NULL);
}
#endif
//
// Call class init Ex routine to register a
// PCLASS_QUERY_WMI_REGINFO_EX routine
//
classQueryWmiRegInfoExList.Size = sizeof(CLASS_QUERY_WMI_REGINFO_EX_LIST);
classQueryWmiRegInfoExList.ClassFdoQueryWmiRegInfoEx = DiskFdoQueryWmiRegInfoEx;
ClassInitializeEx(DriverObject,
&guidQueryRegInfoEx,
&classQueryWmiRegInfoExList);
return status;
} // end DriverEntry()
VOID
DiskUnload(
IN PDRIVER_OBJECT DriverObject
)
{
PAGED_CODE();
#if defined(_X86_) || defined(_AMD64_)
DiskCleanupDetectInfo(DriverObject);
#endif
return;
}
NTSTATUS
DiskCreateFdo(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PULONG DeviceCount,
IN BOOLEAN DasdAccessOnly
)
/*++
Routine Description:
This routine creates an object for the functional device
Arguments:
DriverObject - Pointer to driver object created by system.
PhysicalDeviceObject - Lower level driver we should attach to
DeviceCount - Number of previously installed devices.
DasdAccessOnly - indicates whether or not a file system is allowed to mount
on this device object. Used to avoid double-mounting of
file systems on super-floppies (which can unfortunately be
fixed disks). If set the i/o system will only allow rawfs
to be mounted.
Return Value:
NTSTATUS
--*/
{
PUCHAR deviceName = NULL;
HANDLE handle = NULL;
PDEVICE_OBJECT lowerDevice = NULL;
PDEVICE_OBJECT deviceObject = NULL;
PFUNCTIONAL_DEVICE_EXTENSION fdoExtension;
NTSTATUS status;
PAGED_CODE();
*DeviceCount = 0;
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -