MCPcopy Create free account
hub / github.com/NoMercy-ac/NoMercy / ReadPhysicalDriveInNTUsingSmart

Method ReadPhysicalDriveInNTUsingSmart

Source/Client/NM_Engine/HddData.cpp:75–118  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

73}
74
75bool CHddData::ReadPhysicalDriveInNTUsingSmart()
76{
77 bool bRet = false;
78
79 auto hPhysicalDriveIOCTL = CreateFileA("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
80 if (!IS_VALID_HANDLE(hPhysicalDriveIOCTL))
81 {
82 return bRet;
83 }
84
85 DWORD cbBytesReturned = 0;
86 GETVERSIONINPARAMS GetVersionParams = { 0 };
87 if (!DeviceIoControl(hPhysicalDriveIOCTL, SMART_GET_VERSION, NULL, 0, &GetVersionParams, sizeof(GETVERSIONINPARAMS), &cbBytesReturned, NULL))
88 {
89 return bRet;
90 }
91
92 ULONG CommandSize = sizeof(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE;
93 PSENDCMDINPARAMS Command = (PSENDCMDINPARAMS)malloc(CommandSize);
94 Command->irDriveRegs.bCommandReg = ID_CMD;
95 DWORD BytesReturned = 0;
96
97 if (!DeviceIoControl(hPhysicalDriveIOCTL, SMART_RCV_DRIVE_DATA, Command, sizeof(SENDCMDINPARAMS), Command, CommandSize, &BytesReturned, NULL))
98 {
99 return bRet;
100 }
101
102 DWORD diskdata[256];
103 USHORT* pIdSector = (USHORT*)(PIDENTIFY_DATA)((PSENDCMDOUTPARAMS)Command)->bBuffer;
104
105 for (int ijk = 0; ijk < 256; ijk++)
106 {
107 diskdata[ijk] = pIdSector[ijk];
108 }
109
110 SetDiskData(diskdata);
111 bRet = true;
112
113 // Done
114 CloseHandle(hPhysicalDriveIOCTL);
115 free(Command);
116
117 return bRet;
118}
119
120// DoIDENTIFY FUNCTION: Send an IDENTIFY command to the drive bDriveNum = 0-3 bIDCmd = IDE_ATA_IDENTIFY or IDE_ATAPI_IDENTIFY
121bool CHddData::DoIDENTIFY(HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP, PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum, PDWORD lpcbBytesReturned)

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected