2005年05月09日

ドライバからのファイルアクセス

 ハードウェアに大量のマイクロコードをダウンロードする場合や、詳細な情報ログを作成する場合など、ドライバから通常のディスクファイルをリード・ライトしたいときがある。その実現方法は以下の通りである。

■ファイルのオープン

 ドライバから読み出し用に既存ファイルオープンするときは、以下のようにする。

NTSTATUS status;
OBJECT_ATTRIBUTES oa;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
PUNICODE_STRING pathname;

InitializeObjectAttribute(&oa, pathname, OBJ_CASE_INSENSITIVE,
 NULL, NULL);
status = ZwCreateFile(&hfile, GENERIC_READ, &oa, &iostatus,
 NULL, 0, FILE_SHARE_READ, FILE_OPEN,
 FILE_SYNCHRONOUS_TO_NONALERT, NULL, 0);

 新しいファイルを作成したり、既存ファイルをオーブンしてサイズを0にするには、

status = ZwCreateFile(&hfile, GENERIC_WRITE, &oa, &iostatus,
 NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF,
 FILE_SYNCHRONOUS_TO_NONALERT, NULL, 0);

 これらのコードでは、OBJECT_ATTRIBUTES構造体をセットアップしているが、その主な目的はオープンしようとしているファイルのフルパス名を提供することである。

■ファイルの読み書き

 ドライバは、ZwCreateFileに渡すフラグ次第で同期、非同期のリード/ライトが可能となる。アクセスが完了するまで制御を返さない同期アクセスのコードは以下のようになる。

PVOID buffer;
ULONG bufsize;
status = ZwReadFile(hfile, NULL, NULL, NULL, &iostatus, buffer,
 bufsize, NULL, NULL);

または、

status = ZwWriteFile(hfile, NULL, NULL, NULL, &iostatus, buffer,
 bufsize, NULL, NULL);

 関数が制御を返したら、ファイルアクセスで転送されたバイト数がiostatus.informationに入る。

 メモリバッファにファイル全体を読み出すつもりで、ファイルサイズを調べるには関数ZwQueryInformationFileが有用である。

FILE_STANDARD_INFORMATION si;
ZwQueryInformationFile(hfile, &iostatus, &si, sizeof(si),
 FileStandardInformation);
ULONG length = si.EndOfFile.LowPart;

 WDMドライバは、通常IRP_MN_START_DEVICEリクエストが送られてきてデバイスを初期化しているときに、ディスクファイルを読み出す。安全を期するために、データファイルはシステムルートディレクトリ下の任意ディレクトリに格納し、\SystemRoot\dir\file.extなどの名前でアクセスするとよい。




参考文献

1. Microsoft WDMプログラミング―WindowsXP対応
2.WindowsXPフィルタドライバプログラミング 入門と実践
3. WDMデバイスドライバプログラミング完全ガイド〈上〉
4. WDMデバイスドライバプログラミング完全ガイド〈下〉

blackcat_1973 at 10:27│Comments(0)TrackBack(0)ソフトウェア開発 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Profile
blackcat
スポンサー
訪問者数
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード