|
发表于 2010-8-16 00:49:03
|
显示全部楼层
贵州省贵阳市
.版本 2
.子程序 特殊_取硬盘特征, 整数型, , IDE + SCSI
.参数 iDrive, 整数型, 可空
.参数 硬盘序列号, 文本型, 参考 可空
.参数 硬盘模型号, 文本型, 参考 可空
.局部变量 sFilePath, 文本型
.局部变量 hDevice, 整数型
.局部变量 InBufferIDE, SENDCMDINPARAMS
.局部变量 OutBufferIDE, GETVERSIONINPARAMS
.局部变量 InBufferSCSI, SRB_IO_CONTROL
.局部变量 OutBuffer, 字节集
.局部变量 BytesRet, 整数型
.局部变量 IDEData, IDSECTOR
.如果 (系统_取操作系统类别 () ≥ 4)
sFilePath = “\\.\PHYSICALDRIVE” + 整数型_到文本 (iDrive)
hDevice = CreateFile (sFilePath, 位或 (#GENERIC_READ, #GENERIC_WRITE), 位或 (#FILE_SHARE_READ, #FILE_SHARE_WRITE), 0, #OPEN_EXISTING, 0, 0)
.判断开始 (hDevice ≠ #INVALID_HANDLE_VALUE)
.如果真 (DeviceIoControl1 (hDevice, #SMART_GET_VERSION, 0, 0, OutBufferIDE, 24, BytesRet, 0) ≠ 0)
OutBuffer = 字节集_取空白 (544)
InBufferIDE.cBufferSize = 512
InBufferIDE.bSectorCountReg = 1
InBufferIDE.bSectorNumberReg = 1
.如果 (位与 (iDrive, 1) ≠ 0)
InBufferIDE.bDriveHeadReg = 176
.否则
InBufferIDE.bDriveHeadReg = 160
.如果结束
.如果 (iDrive ≠ 0)
InBufferIDE.bCommandReg = OutBufferIDE.bIDEDeviceMap ÷ 位与 (iDrive, 16)
.否则
InBufferIDE.bCommandReg = OutBufferIDE.bIDEDeviceMap
.如果结束
.如果 (InBufferIDE.bCommandReg = 0)
InBufferIDE.bCommandReg = #ATAPI_ID_CMD
.否则
InBufferIDE.bCommandReg = #ID_CMD
.如果结束
.如果真 (DeviceIoControl2 (hDevice, #SMART_RCV_DRIVE_DATA, InBufferIDE, 32, OutBuffer, 544, BytesRet, 0) = 0)
InBufferIDE.bCommandReg = #ID_CMD
DeviceIoControl2 (hDevice, #SMART_RCV_DRIVE_DATA, InBufferIDE, 32, OutBuffer, 544, BytesRet, 0)
.如果真结束
RtlMoveMemory_IDE (IDEData, 字节集_取中间 (OutBuffer, 17, 256), 256)
.如果真结束
.默认
CloseHandle (hDevice)
sFilePath = “\\.\SCSI” + 整数型_到文本 (iDrive) + “:”
hDevice = CreateFile (sFilePath, 位或 (#GENERIC_READ, #GENERIC_WRITE), 位或 (#FILE_SHARE_READ, #FILE_SHARE_WRITE), 0, #OPEN_EXISTING, 0, 0)
.如果真 (hDevice ≠ #INVALID_HANDLE_VALUE)
InBufferSCSI.HeaderLength = 28
RtlMoveMemory_SCSI (InBufferSCSI.Signature, “SCSIDISK”, 8)
InBufferSCSI.Timeout = 2
InBufferSCSI.Length = 544
InBufferSCSI.ControlCode = #IOCTL_SCSI_MINIPORT_IDENTIFY
InBufferSCSI.cBufferSize = 512
InBufferSCSI.bSectorCountReg = 1
InBufferSCSI.bSectorNumberReg = 1
.如果 (位与 (iDrive, 1) ≠ 0)
InBufferSCSI.bDriveHeadReg = 176
.否则
InBufferSCSI.bDriveHeadReg = 160
.如果结束
InBufferSCSI.bCommandReg = #ID_CMD
OutBuffer = 字节集_取空白 (572)
.如果真 (DeviceIoControl3 (hDevice, #IOCTL_SCSI_MINIPORT, InBufferSCSI, 60, OutBuffer, 572, BytesRet, 0) ≠ 0)
RtlMoveMemory_IDE (IDEData, 字节集_取中间 (OutBuffer, 45, 256), 256)
.如果真结束
.如果真结束
.判断结束
.否则
sFilePath = “\\.\SMARTVSD”
hDevice = CreateFile (sFilePath, 0, 0, 0, 1, 0, 0)
.如果真 (hDevice ≠ #INVALID_HANDLE_VALUE)
InBufferIDE.cBufferSize = 512
InBufferIDE.bSectorCountReg = 1
InBufferIDE.bSectorNumberReg = 1
.如果 (位与 (iDrive, 1) ≠ 0)
InBufferIDE.bDriveHeadReg = 176
.否则
InBufferIDE.bDriveHeadReg = 160
.如果结束
InBufferIDE.bCommandReg = 236
OutBuffer = 字节集_取空白 (528)
.如果真 (DeviceIoControl2 (hDevice, #DFP_RECEIVE_DRIVE_DATA, InBufferIDE, 32, OutBuffer, 528, BytesRet, 0) ≠ 0)
RtlMoveMemory_IDE (IDEData, 字节集_取中间 (OutBuffer, 17, 256), 256)
.如果真结束
.如果真结束
.如果结束
CloseHandle (hDevice)
.如果真 (是否为空 (硬盘序列号) = 假)
硬盘序列号 = FixString (IDEData.sSerialNumber)
.如果真结束
.如果真 (是否为空 (硬盘模型号) = 假)
硬盘模型号 = FixString (IDEData.sModelNumber)
.如果真结束
返回 (特征字计算 (IDEData)) |
|