5

さまざまな文字列のIOCTL定数(たとえば、IOCTL_ATA_PASS_THROUGHの定数の値)を知る必要があります。ネットを検索すると、これらの定数はヘッダーNtddscsi.hで定義されていますが、これらの定数は間違っていることがわかりました。たとえば、IOCTL_ATA_PASS_THROUGHの定数値は4D02Cである必要がありますが、ヘッダーファイルでは40Bです。

問題は、すべての正しい値を含むリストをどこで見つけることができるかということです。

ありがとう

編集:

すべてのコードがリストされているhttp://www.ioctls.net/を見つけました。とにかく、Ntddscsi.hの値が「最終的な」値ではない理由の説明に感謝します

4

1 に答える 1

13

これらは、c:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Include \(64ビットシステムの場合)にあるntddscsi.hにあります。彼らは次のように反抗します:

#define IOCTL_ATA_PASS_THROUGH          CTL_CODE(IOCTL_SCSI_BASE, 0x040b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)

そしてIOCTL_SCSI_BASE_

#define IOCTL_SCSI_BASE                 FILE_DEVICE_CONTROLLER

同じファイルから

そしてこれらはWinIoCtl.hから

#define METHOD_BUFFERED                 0
#define FILE_DEVICE_CONTROLLER          0x00000004
#define FILE_READ_ACCESS          ( 0x0001 )    // file & pipe
#define FILE_WRITE_ACCESS         ( 0x0002 )    // file & pipe

これは、c:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \Include\にCTL_CODEあるWinIoCtl.hから取得されます。

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \

)。

したがって、IOCTL_ATA_PASS_THROUGHの最終的な値は次のようになります。

(4 << 16 | (1 | 2) << 14 | 0x040b << 2 | 0) = 315436 = 4D02C 

:D

そして、これらの計算を他のIO _....マクロに適用すると、値が見つかります。一方、値を16進数として出力するだけの短いアプリケーションを作成する方がはるかに簡単です;)

于 2012-06-22T08:27:13.167 に答える