|
- ENVI^ ENVIMODE=1
- //LOGS **2 * %&CurDir%\log.log
- ENVI &&hd=0
- IFEX $1<0,
- {*
- #define GENERIC_READ (0x80000000L)
- #define GENERIC_WRITE (0x40000000L)
- #define GENERIC_EXECUTE (0x20000000L)
- #define GENERIC_ALL (0x10000000L)
- }
- ENVI &&GENERIC_READ=0x80000000
- ENVI &&GENERIC_WRITE=0x40000000
- //ENVI &&lpFileName=\\\\.\\PhysicalDrive%&&hd%
- ENVI &&lpFileName=\\.\PhysicalDrive%&&hd%
- CALC &&dwDesiredAccess=%&&GENERIC_READ% | %&&GENERIC_WRITE%
- IFEX $1<0,
- {*
- // The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
- // devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
- // constants *MUST* always be in sync.
- // The values are redefined in devioctl.h because they must be available to
- // both DOS and NT.
- //
- #define FILE_READ_DATA ( 0x0001 ) // file & pipe
- #define FILE_LIST_DIRECTORY ( 0x0001 ) // directory
- #define FILE_WRITE_DATA ( 0x0002 ) // file & pipe
- #define FILE_ADD_FILE ( 0x0002 ) // directory
- #define FILE_APPEND_DATA ( 0x0004 ) // file
- #define FILE_ADD_SUBDIRECTORY ( 0x0004 ) // directory
- #define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) // named pipe
- #define FILE_READ_EA ( 0x0008 ) // file & directory
- #define FILE_WRITE_EA ( 0x0010 ) // file & directory
- #define FILE_EXECUTE ( 0x0020 ) // file
- #define FILE_TRAVERSE ( 0x0020 ) // directory
- #define FILE_DELETE_CHILD ( 0x0040 ) // directory
- #define FILE_READ_ATTRIBUTES ( 0x0080 ) // all
- #define FILE_WRITE_ATTRIBUTES ( 0x0100 ) // all
- #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
- #define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
- FILE_READ_DATA |\
- FILE_READ_ATTRIBUTES |\
- FILE_READ_EA |\
- SYNCHRONIZE)
- #define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
- FILE_WRITE_DATA |\
- FILE_WRITE_ATTRIBUTES |\
- FILE_WRITE_EA |\
- FILE_APPEND_DATA |\
- SYNCHRONIZE)
- #define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
- FILE_READ_ATTRIBUTES |\
- FILE_EXECUTE |\
- SYNCHRONIZE)
- #define FILE_SHARE_READ 0x00000001
- #define FILE_SHARE_WRITE 0x00000002
- #define FILE_SHARE_DELETE 0x00000004
- #define FILE_ATTRIBUTE_READONLY 0x00000001
- #define FILE_ATTRIBUTE_HIDDEN 0x00000002
- #define FILE_ATTRIBUTE_SYSTEM 0x00000004
- #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
- #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
- #define FILE_ATTRIBUTE_DEVICE 0x00000040
- #define FILE_ATTRIBUTE_NORMAL 0x00000080
- #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
- #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
- #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
- #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
- #define FILE_ATTRIBUTE_OFFLINE 0x00001000
- #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
- #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
- #define FILE_ATTRIBUTE_INTEGRITY_STREAM 0x00008000
- #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
- #define FILE_ATTRIBUTE_NO_SCRUB_DATA 0x00020000
- #define FILE_ATTRIBUTE_EA 0x00040000
- #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
- #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
- #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
- #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
- #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
- #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
- #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
- #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
- #define FILE_ACTION_ADDED 0x00000001
- #define FILE_ACTION_REMOVED 0x00000002
- #define FILE_ACTION_MODIFIED 0x00000003
- #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
- #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
- #define MAILSLOT_NO_MESSAGE ((DWORD)-1)
- #define MAILSLOT_WAIT_FOREVER ((DWORD)-1)
- #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
- #define FILE_CASE_PRESERVED_NAMES 0x00000002
- #define FILE_UNICODE_ON_DISK 0x00000004
- #define FILE_PERSISTENT_ACLS 0x00000008
- #define FILE_FILE_COMPRESSION 0x00000010
- #define FILE_VOLUME_QUOTAS 0x00000020
- #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
- #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
- #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
- #define FILE_VOLUME_IS_COMPRESSED 0x00008000
- #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
- #define FILE_SUPPORTS_ENCRYPTION 0x00020000
- #define FILE_NAMED_STREAMS 0x00040000
- #define FILE_READ_ONLY_VOLUME 0x00080000
- #define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
- #define FILE_SUPPORTS_TRANSACTIONS 0x00200000
- #define FILE_SUPPORTS_HARD_LINKS 0x00400000
- #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
- #define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
- #define FILE_SUPPORTS_USN_JOURNAL 0x02000000
- #define FILE_SUPPORTS_INTEGRITY_STREAMS 0x04000000
- #define FILE_INVALID_FILE_ID ((LONGLONG)-1LL)
- typedef struct _FILE_ID_128 {
- BYTE Identifier[16];
- } FILE_ID_128, *PFILE_ID_128;
- }
- ENVI &&FILE_SHARE_READ=0x00000001
- ENVI &&FILE_SHARE_WRITE=0x00000002
- ENVI &&FILE_SHARE_DELETE=0x00000004
- CALC &&dwShareMode=%&&FILE_SHARE_DELETE% | %&&FILE_SHARE_READ% | %&&FILE_SHARE_WRITE%
- IFEX $1<0,
- {*
- #define CREATE_NEW 1
- #define CREATE_ALWAYS 2
- #define OPEN_EXISTING 3
- #define OPEN_ALWAYS 4
- #define TRUNCATE_EXISTING 5
- #define INVALID_FILE_SIZE ((DWORD)0xFFFFFFFF)
- #define INVALID_SET_FILE_POINTER ((DWORD)-1)
- #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
- }
- ENVI &&OPEN_EXISTING=3
- CALC &&dwFlagsAndAttributes=%&&OPEN_EXISTING%
- //失败返回INVALID_HANDLE_VALUE=-1
- CALL $--qd --ret:&&hDevice Kernel32.dll,CreateFileW,$%&&lpFileName%,#%&&dwDesiredAccess%,#%&&dwShareMode%,#0,#%&&dwFlagsAndAttributes%,#0,#0
- CALL $--ret:&&GetLastErrorRet Kernel32.dll,GetLastError
- MESS. %&&hDevice% %&&GetLastErrorRet%
- IFEX $%&&hDevice%=-1,EXIT
- CALC &&SMART_RCV_DRIVE_DATA=508040 //这个用VS算出来的,我也不知道怎么算的 - -!
- CALC &&dwIoControlCode=%&&SMART_RCV_DRIVE_DATA%
- //结构体
- IFEX $1<0,
- {*
- typedef struct _SENDCMDINPARAMS {
- DWORD cBufferSize; // Buffer size in bytes //4b
- IDEREGS irDriveRegs; // Structure with drive register values. //8b
- BYTE bDriveNumber; // Physical drive number to send //1b
- // command to (0,1,2,3).
- BYTE bReserved[3]; // Reserved for future expansion. //3b
- DWORD dwReserved[4]; // For future use. //16b
- BYTE bBuffer[1]; // Input buffer. //1b
- } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS; //33b
- typedef struct _IDEREGS {
- BYTE bFeaturesReg; // Used for specifying SMART "commands".
- BYTE bSectorCountReg; // IDE sector count register
- BYTE bSectorNumberReg; // IDE sector number register
- BYTE bCylLowReg; // IDE low order cylinder value
- BYTE bCylHighReg; // IDE high order cylinder value
- BYTE bDriveHeadReg; // IDE drive/head register
- BYTE bCommandReg; // Actual IDE command.
- BYTE bReserved; // reserved for future use. Must be zero.
- } IDEREGS, *PIDEREGS, *LPIDEREGS; //8b
- }
- ENVI &&nInBufferSize=33
- ENVI$# &&lpInBuffer=*%&&nInBufferSize% 0
- IFEX $1<0,
- {*
- #define READ_ATTRIBUTE_BUFFER_SIZE 512
- #define IDENTIFY_BUFFER_SIZE 512
- #define READ_THRESHOLD_BUFFER_SIZE 512
- #define SMART_LOG_SECTOR_SIZE 512
- }
- ENVI &&READ_ATTRIBUTE_BUFFER_SIZE=512
- ENVI-long &&cBufferSize=%&&READ_ATTRIBUTE_BUFFER_SIZE%
- ENVI$# &&irDriveRegs=*8 0
- IFEX $1<0,
- {*
- #define READ_ATTRIBUTES 0xD0
- #define READ_THRESHOLDS 0xD1
- #define ENABLE_DISABLE_AUTOSAVE 0xD2
- #define SAVE_ATTRIBUTE_VALUES 0xD3
- #define EXECUTE_OFFLINE_DIAGS 0xD4
- #define SMART_READ_LOG 0xD5
- #define SMART_WRITE_LOG 0xd6
- #define ENABLE_SMART 0xD8
- #define DISABLE_SMART 0xD9
- #define RETURN_SMART_STATUS 0xDA
- #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB
- #endif /* _WIN32_WINNT >= 0x0400 */
- }
- ENVI &&READ_ATTRIBUTES=0xD0
- ENVI-char &&bFeaturesReg=%&&READ_ATTRIBUTES%
- ENVI-char &&bSectorCountReg=1
- ENVI-char &&bSectorNumberReg=1
- IFEX $1<0,
- {*
- //
- // Cylinder register defines for SMART command
- //
- #define SMART_CYL_LOW 0x4F
- #define SMART_CYL_HI 0xC2
- }
- ENVI &&SMART_CYL_LOW=0x4F
- ENVI &&SMART_CYL_HI=0xC2
- ENVI-char &&bCylLowReg=%&&SMART_CYL_LOW%
- ENVI-char &&bCylHighReg=%&&SMART_CYL_HI%
- ENVI-char &&bDriveHeadReg=0xA0
- IFEX $1<0,
- {*
- //
- // Valid values for the bCommandReg member of IDEREGS.
- //
- #define ATAPI_ID_CMD 0xA1 // Returns ID sector for ATAPI.
- #define ID_CMD 0xEC // Returns ID sector for ATA.
- #define SMART_CMD 0xB0 // Performs SMART cmd.
- // Requires valid bFeaturesReg,
- // bCylLowReg, and bCylHighReg
- }
- ENVI &&SMART_CMD=0xB0
- ENVI-char &&bCommandReg=%&&SMART_CMD%
- ENVI-copy &&irDriveRegs=&&bFeaturesReg;;1;0
- ENVI-copy &&irDriveRegs=&&bSectorCountReg;;1;1
- ENVI-copy &&irDriveRegs=&&bSectorNumberReg;;1;2
- ENVI-copy &&irDriveRegs=&&bCylLowReg;;1;3
- ENVI-copy &&irDriveRegs=&&bCylHighReg;;1;4
- ENVI-copy &&irDriveRegs=&&bDriveHeadReg;;1;5
- ENVI-copy &&irDriveRegs=&&bCommandReg;;1;6
- ENVI-char &&bDriveNumber=%&&hd%
- ENVI-copy &&lpInBuffer=&&cBufferSize;;4;0
- ENVI-copy &&lpInBuffer=&&irDriveRegs;;8;4
- ENVI-copy &&lpInBuffer=&&bDriveNumber;;1;12
- //BYTE szAttributes[sizeof(SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1]; 17 + 512 -1
- IFEX $1<0,
- {*
- typedef struct _SENDCMDOUTPARAMS {
- DWORD cBufferSize; // Size of bBuffer in bytes
- DRIVERSTATUS DriverStatus; // Driver status structure.
- BYTE bBuffer[1]; // Buffer of arbitrary length in which to store the data read from the // drive.
- } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS; //17b
- }
- CALC &&nOutBufferSize=17 + 512 -1
- //ENVI-char &&lpOutBuffer=%&&nOutBufferSize%
- ENVI$# &&lpOutBuffer=*%&&nOutBufferSize% 0
- MESS. LAI
- //ENVI-long &&lpBytesReturned=0
- ENVI$# &&lpBytesReturned=*8 0
- CALL $--qd --bool --ret:&&bResult Kernel32.dll,DeviceIoControl,#%&&hDevice%,#%&&dwIoControlCode%,*&&lpInBuffer,#%&&nInBufferSize%,*&&lpOutBuffer,#%&&nOutBufferSize%,*&&lpBytesReturned,#0
- //CALL $--qd --bool --ret:&&bResult Kernel32.dll,DeviceIoControl,#%&&hDevice%,#%&&dwIoControlCode%,*&&lpInBuffer,#%&&nInBufferSize%,*&&lpOutBuffer,#%&&nOutBufferSize%,#0,#0
- CALL $--ret:&&GetLastErrorRet Kernel32.dll,GetLastError
- MESS. %&&bResult% %&&GetLastErrorRet%
- CALL $--qd --bool --ret:&&CloseHandleRet Kernel32.dll,CloseHandle,#%&&hDevice%
- MESS. %&&CloseHandleRet%
- EXIT FILE
- https://blog.csdn.net/cracker_zhou/article/details/73348966
- // 这里的diskid大概长这个样子:"\\\\.\\PHYSICALDRIVE0","\\\\.\\PHYSICALDRIVE1"
- bool ReadSMARTAttributes(const char* diskid, ata_smart_values& smart_value, ata_smart_thresholds_pvt& threshold_value)
- {
- BOOL bRet = false;
- const wchar_t* physical_prefix = L"\\\\.\\PhysicalDrive";
- if (diskid != NULL && wcslen(diskid) > wcslen(physical_prefix) &&
- _wcsnicmp(diskid, physical_prefix, wcslen(physical_prefix)) == 0)
- {
- DWORD dwRet = 0;
- int ucDriveIndex = wcstol(diskid + wcslen(physical_prefix), NULL, 10);
- HANDLE hDevice = CreateFileW(diskid, GENERIC_READ | GENERIC_WRITE,
- FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
- if (hDevice == INVALID_HANDLE_VALUE) return false;
- BYTE szAttributes[sizeof(SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1];
- SENDCMDINPARAMS stCIP = { 0 };
- stCIP.cBufferSize = READ_ATTRIBUTE_BUFFER_SIZE;
- stCIP.bDriveNumber = ucDriveIndex;
- stCIP.irDriveRegs.bFeaturesReg = READ_ATTRIBUTES;
- stCIP.irDriveRegs.bSectorCountReg = 1;
- stCIP.irDriveRegs.bSectorNumberReg = 1;
- stCIP.irDriveRegs.bCylLowReg = SMART_CYL_LOW;
- stCIP.irDriveRegs.bCylHighReg = SMART_CYL_HI;
- stCIP.irDriveRegs.bDriveHeadReg = 0xA0;
- stCIP.irDriveRegs.bCommandReg = SMART_CMD;
- bRet = DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, &stCIP, sizeof(stCIP), szAttributes, sizeof(SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1, &dwRet, NULL);
- if (bRet)
- {
- smart_value = *(ata_smart_values*)(((SENDCMDOUTPARAMS*)szAttributes)->bBuffer);
- }
- stCIP.irDriveRegs.bFeaturesReg = READ_THRESHOLDS;
- stCIP.cBufferSize = READ_THRESHOLD_BUFFER_SIZE;
- bRet &= DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, &stCIP, sizeof(stCIP), szAttributes, sizeof(SENDCMDOUTPARAMS) + READ_ATTRIBUTE_BUFFER_SIZE - 1, &dwRet, NULL);
- if (bRet)
- {
- threshold_value = *(ata_smart_thresholds_pvt*)(((SENDCMDOUTPARAMS*)szAttributes)->bBuffer);
- }
- CloseHandle(hDevice);
- }
- return !!bRet;
- }
复制代码 这个我之前翻译的,M大看看和你内置的功能是否一样。奇怪,我这里win7x64系统下读不出来,老是返回错误1117,在家里win10的电脑上又可以。用你的内置代码测试了下,结果一样。是不是有写情况就是注定读不了的呀,有没有需要提权这种说法?分享给大伙玩一下。最近在做PECMD的一些直播,希望大家多来一起玩PECMD。
|
|