|
BOOL TFrmMain::DoIdentify(HANDLE DiskDevice, BYTE DriveNum,PDWORD BytesReturned)
{
BOOL Result = FALSE;
// Speicherplatz fur Befehle und Daten anfordern
unsigned int InDataSize = 0, ISize = sizeof(SENDCMDINPARAMS) + InDataSize;
unsigned int OutDataSize = 512, OSize = sizeof(SENDCMDOUTPARAMS) + OutDataSize;
// VirtualAlloc sorgt dafur, dass der Geratetreiber den Speicher ansprechen kann
SENDCMDINPARAMS *IP = (SENDCMDINPARAMS *)VirtualAlloc(NULL, ISize, MEM_COMMIT, PAGE_READWRITE);
SENDCMDOUTPARAMS *OP = (SENDCMDOUTPARAMS *)VirtualAlloc(NULL, OSize, MEM_COMMIT, PAGE_READWRITE);
if (IP && OP)
{
memset(IP, 0, ISize);
//이부분이 의미하는 바가 무언가요?
//Set up data structures for IDENTIFY command.
IP->irDriveRegs.bSectorCountReg = 1;
IP->irDriveRegs.bSectorNumberReg = 1;
IP->irDriveRegs.bFeaturesReg = 0;
IP->irDriveRegs.bCylLowReg = 0;
IP->irDriveRegs.bCylHighReg = 0;
//Compute the drive number;
IP->irDriveRegs.bDriveHeadReg = 0xA0 | ((DriveNum & 1) << 4);
//The Command can either be IDE identify or ATAPI identify.
IP->irDriveRegs.bCommandReg = 0xEC;
IP->bDriveNumber = 0;
IP->cBufferSize = OutDataSize;
memset(OP, 0, OSize);
OP->cBufferSize = OSize;
if (DeviceIoControl(DiskDevice,
SMART_RCV_DRIVE_DATA,
(LPVOID)IP,
sizeof(SENDCMDINPARAMS)-1,
(LPVOID)OP,
sizeof(SENDCMDOUTPARAMS)+512-1,
BytesReturned, NULL))
{
Result = TRUE;
char ModelStr [40 + 1];
char FirmwareStr[ 8 + 1];
char SerialStr [20 + 1];
GetIdentifyStr(ModelStr, ((PWORD)OP->bBuffer) + 27, 20);
GetIdentifyStr(FirmwareStr, ((PWORD)OP->bBuffer) + 23, 4);
GetIdentifyStr(SerialStr, ((PWORD)OP->bBuffer) + 10, 10);
// LogMsg(AnsiString().sprintf("ASDFASDF: %s",OP->DriverStatus);
LogMsg(AnsiString().sprintf("Model: %s\n", ModelStr));
LogMsg(AnsiString().sprintf("Firmware: %s\n", FirmwareStr));
LogMsg(AnsiString().sprintf("Serial nummer: %s\n", SerialStr));
}
else
{
// LogMsg(AnsiString().sprintf("GetLastError %u, BytesReturned: %u,\nDriverStatus %u, IDE Status: %u\n", GetLastError(), BytesReturned, OP->DriverStatus.bDriverError, OP->DriverStatus.bIDEStatus));
}
}
if (IP) VirtualFree(IP, 0, MEM_RELEASE);
if (OP) VirtualFree(OP, 0, MEM_RELEASE);
return Result;
}
|