kernel do driver de modo de escrita para arquivo
Pergunta
Eu estou trabalhando em um driver de filtro de teclado janelas e eu preciso escrever para um arquivo. Eu tentei usar zwcreate, zwwrite e ZwClose mas o motorista não está funcionando em PASSIVE_LEVEL e eu tenho o BSOD. Eu nunca escrevi um driver do Windows antes. Obrigado pela ajuda!
EDIT: Graças J. Passing
!Solução
workitems agendamento (IoAllocateWorkItem / IoQueueWorkItem) e lidar com todos os arquivos I / O a partir de dentro as rotinas workitem de retorno de chamada.
Eu não tenho certeza se é uma boa idéia para deixar o write driver de kernel em um arquivo em primeiro lugar. A melhor maneira de fazer isso IMHO é fornecer um programa de espaço do usuário que se comunica com o condutor, obtém os dados e, em seguida, escreve-lo no disco.
Isto é verdade para Unix, mas não para Windows.
Outras dicas
Um exemplo maravilhoso para usar ZW-Ferramentas para arquivos de gravação de um driver de dispositivo é klog do Clandestiny encontrada em rootkit.com . Ele está atualmente ajudando-me muito.
E bem, eu concordo meio com Johannes que não é aconselhável fazer userland-obra clássica (arquivo / /...- acesso à rede) diretamente de um motorista. Não só é errorprone, é também pode quebrar imprevisível no futuro. interfaces de usuário normalmente são muito mais estável e resistente.
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);