ScsiClass2分析

我感觉磁盘驱动是mini driver+class driver。

其中class2.sys就是类驱动
而disk.sys就是mini driver

mini driver的DriverEntry调用

NTSTATUS STDCALL
DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
CLASS_INIT_DATA InitData;

RtlZeroMemory(&InitData,
sizeof(CLASS_INIT_DATA));

InitData.InitializationDataSize = sizeof(CLASS_INIT_DATA);
InitData.DeviceExtensionSize = sizeof(DEVICE_EXTENSION) + sizeof(DISK_DATA);
InitData.DeviceType = FILE_DEVICE_DISK;
InitData.DeviceCharacteristics = 0;

InitData.ClassError = NULL; // DiskClassProcessError;
InitData.ClassReadWriteVerification = DiskClassCheckReadWrite;
InitData.ClassFindDeviceCallBack = DiskClassCheckDevice;
InitData.ClassFindDevices = DiskClassFindDevices;
InitData.ClassDeviceControl = DiskClassDeviceControl;
InitData.ClassShutdownFlush = DiskClassShutdownFlush;
InitData.ClassCreateClose = NULL;
InitData.ClassStartIo = NULL;

return(ScsiClassInitialize(DriverObject,
RegistryPath,
&InitData));
}
 
在ScsiClassInitialize中,它利用\Device\ScsiPort0或\Device\ScsiPort1读取磁盘资料。

	  /* check scsi port for attached disk drives */
if (InitializationData->ClassFindDevices(DriverObject,
Argument2,
InitializationData,
PortDeviceObject,
PortNumber))
{
DiskFound = TRUE;
}
 
下面是disk.sys中的DiskClassFindDevices

posted @ 2009-06-03 10:57  Fan Zhang  阅读(272)  评论(0编辑  收藏  举报