ファイルへのカーネルモードドライバの書き込み
質問
私はWindowsキーボードフィルタドライバに取り組んでいると私は、ファイルに記述する必要があります。私はzwcreate、zwwrite、およびzwcloseを使用してみましたが、ドライバはPASSIVE_LEVELで実行されていないと私はBSODを得ました。私は前にWindowsドライバを書いたことがありません。助けてくれてありがとう!
編集:ありがとう!J.が渡す
解決
スケジュール作業項目(IoAllocateWorkItem / IoQueueWorkItem)と、ワークアイテムのコールバック・ルーチン内からすべてのファイルI / Oを処理します。
私は最初の場所にあるファイルへのカーネルドライバの書き込みを聞かせすることをお勧めしますかはわかりません。そのIMHOを行うための最善の方法は、ドライバと通信し、ユーザ空間プログラムを提供することで、データを取得し、ディスクに書き込みます。
これは、Windows用のUnixのための真のですが、ありません。
他のヒント
デバイスドライバからファイルを書き込むことがZwは、ツールを使用するための素晴らしい例はClandestinyのにklogは<のhref =「http://www.rootkit.com/board_project_fused.php?did=proj21」のrel = "nofollowをで発見されますnoreferrer "> rootkit.com を。これは、現在、私をたくさん助けています。
、よく、私はちょっとドライバーから直接古典ユーザランド作業(ファイル/ネット/...-アクセス)を行うことをお勧めではないことをヨハネスに同意します。だけでなく、それはerrorproneあり、それはまた、将来的にunforseeable壊すかもしれないです。ユーザー・インタフェースは、通常、はるかに安定して弾力性があります。
PCUCHAR buffer[] = {0x00, 0x01, 0x02, 0x03}; // for example
ULONG bufferSize = sizeof(buffer);
UNICODE_STRING filePath; // Must be with DOS prefix: \??\C:\MyFolder\logs.txt
HANDLE hFile;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
InitializeObjectAttributes(&ObjectAttributes, &filePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
NTSTATUS Status = ZwCreateFile(&hFile, FILE_GENERIC_READ | FILE_GENERIC_WRITE, &ObjectAttributes,
&IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE,
FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
if (!NT_SUCCESS(Status))
{
DbgPrint("[DRV_NAME]: Creating file error");
return Status;
}
Status = ZwWriteFile(hFile, NULL, NULL, NULL, &IoStatusBlock, (PVOID)buffer, bufferSize, NULL, NULL);
if (!NT_SUCCESS(Status))
{
InjDbgPrint("[DRV_NAME]: Writing file error");
return Status;
}
ZwClose(hFile);