📄 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 "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, DiskModeSelect)
#pragma alloc_text(PAGE, DisableWriteCache)
#pragma alloc_text(PAGE, DiskIoctlVerify)
#pragma alloc_text(PAGE, DiskSetSpecialHacks)
#pragma alloc_text(PAGE, DiskScanRegistryForSpecial)
#pragma alloc_text(PAGE, DiskQueryPnpCapabilities)
#pragma alloc_text(PAGE, DiskGetCacheInformation)
#pragma alloc_text(PAGE, DiskSetCacheInformation)
#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)))
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;
CLASS_QUERY_WMI_REGINFO_EX_LIST classQueryWmiRegInfoExList;
GUID guidQueryRegInfoEx = GUID_CLASSPNP_QUERY_REGINFOEX;
NTSTATUS status;
#if defined(_X86_)
//
// Read the information NtDetect squirreled away about the disks in this
// system.
//
status = DiskSaveDetectInfo(DriverObject);
if(!NT_SUCCESS(status)) {
DebugPrint((1, "Disk: couldn't save NtDetect information (%#08lx)\n",
status));
}
#endif
//
// Zero InitData
//
RtlZeroMemory (&InitializationData, sizeof(CLASS_INIT_DATA));
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.ClassDeviceControl = DiskDeviceControl;
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_)
if(NT_SUCCESS(status)) {
IoRegisterBootDriverReinitialization(DriverObject,
DiskDriverReinitialization,
NULL);
}
#endif
//
// Call class init Ex routine to register a
// PCLASS_QUERY_WMI_REGINFO_EX routine
//
RtlZeroMemory(&classQueryWmiRegInfoExList, sizeof(CLASS_QUERY_WMI_REGINFO_EX_LIST));
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_)
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
--*/
{
CCHAR ntNameBuffer[MAXIMUM_FILENAME_LENGTH];
STRING ntNameString;
UNICODE_STRING ntUnicodeString;
PUCHAR deviceName = NULL;
OBJECT_ATTRIBUTES objectAttributes;
HANDLE handle;
NTSTATUS status;
PDEVICE_OBJECT lowerDevice = NULL;
PDEVICE_OBJECT deviceObject = NULL;
PFUNCTIONAL_DEVICE_EXTENSION fdoExtension;
STORAGE_PROPERTY_ID propertyId;
PSTORAGE_DEVICE_DESCRIPTOR deviceDescriptor;
PAGED_CODE();
*DeviceCount = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -