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

!
Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top