Como abrir um arquivo de um driver de dispositivo de modo kernel e como ler ou gravar no arquivo

O suporte para o Windows XP terminou

A Microsoft terminou o suporte para o Windows XP em 8 de abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

O suporte para o Windows Server 2003 termina em 14 de julho de 2015.

A Microsoft terminou o suporte para o Windows Server 2003 em 14 de julho de 2015. Esta alteração afetou as suas atualizações de software e opções de segurança. Saiba o que isto significa para você e como permanecer protegido.

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 891805
INTRODUÇÃO
Este artigo descreve como abrir um arquivo de disco a partir de um driver de dispositivo do modo de kernel e como ler ou gravar no arquivo.
Mais Informações

Referir-se para um arquivo pelo seu nome de objeto

Drivers de dispositivo no modo kernel referir-se um arquivo pelo seu nome de objeto. Esse nome é \DosDevices juntamente com o caminho completo do arquivo. Por exemplo, o nome do objeto do arquivo C:\Windows\Example.txt é \DosDevices\C:\Windows\Example.txt. Em seguida, o nome do objeto é encapsulado em uma estrutura OBJECT_ATTRIBUTES chamando a função InitializeObjectAttributes .

Observação Se o driver de dispositivo é carregado no início, o namespace \DosDevices não pode ainda existir. Portanto, o namespace \DosDevices é inacessível para o driver de dispositivo porque nenhuma letra de unidade é exposta. A única parte do sistema de arquivos é garantido que estará disponível é o namespace \SystemRoot . O namespace \SystemRoot é mapeado para a pasta onde o sistema operacional está instalado. Por exemplo, esta pasta pode ser C:\Windows ou D:\Winnt.

O exemplo de código a seguir ilustra como referir-se para um arquivo por seu nome de objeto.
    UNICODE_STRING     uniName;    OBJECT_ATTRIBUTES  objAttr;    RtlInitUnicodeString(&uniName, L"\\DosDevices\\C:\\WINDOWS\\example.txt");  // or L"\\SystemRoot\\example.txt"    InitializeObjectAttributes(&objAttr, &uniName,                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,                               NULL, NULL);

Obter um identificador de arquivo

Para obter um identificador de arquivo, você pode passar uma estrutura OBJECT_ATTRIBUTES para a função ZwCreateFile . O parâmetro DesiredAccess pode ser definido como LEITURA_GENÉRICA , GRAVAÇÃO_GENÉRICA ou GENÉRICO_TUDO , dependendo do que você deseja fazer. Se você definir o parâmetro CreateOptions FILE_SYNCHRONOUS_IO_NONALERT ou FILE_SYNCHRONOUS_IO_ALERT , o sistema de arquivos controla do atual deslocamento de posição do arquivo. Portanto, você seqüencialmente pode ler ou gravar o arquivo mais tarde. Além disso, você pode acessar o arquivo em um local aleatório.

O exemplo de código a seguir ilustra como obter um identificador de arquivo.
    HANDLE   handle;    NTSTATUS ntstatus;    IO_STATUS_BLOCK    ioStatusBlock;    // Do not try to perform any file operations at higher IRQL levels.    // Instead, you may use a work item or a system worker thread to perform file operations.    if(KeGetCurrentIrql() != PASSIVE_LEVEL)        return STATUS_INVALID_DEVICE_STATE;     ntstatus = ZwCreateFile(&handle,                            GENERIC_WRITE,                            &objAttr, &ioStatusBlock, NULL,                            FILE_ATTRIBUTE_NORMAL,                            0,                            FILE_OVERWRITE_IF,                             FILE_SYNCHRONOUS_IO_NONALERT,                            NULL, 0);

Ler ou gravar em um arquivo

Agora você pode chamar a função ZwReadFile ou a função ZwWriteFile . Quando você tiver terminado de modificar o arquivo, feche o identificador usando a função ZwClose .

O exemplo de código a seguir ilustra como gravar em um arquivo.
    #define  BUFFER_SIZE 30    CHAR     buffer[BUFFER_SIZE];    size_t  cb;    if(NT_SUCCESS(ntstatus)) {        ntstatus = RtlStringCbPrintfA(buffer, sizeof(buffer), "This is %d test\r\n", 0x0);    	if(NT_SUCCESS(ntstatus)) {      	    ntstatus = RtlStringCbLengthA(buffer, sizeof(buffer), &cb);       	    if(NT_SUCCESS(ntstatus)) {                ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,	          		       buffer, cb, NULL, NULL);       	    }    	}        ZwClose(handle);    }
o exemplo de código a seguir ilustra como ler a partir de um arquivo.
    LARGE_INTEGER      byteOffset;    ntstatus = ZwCreateFile(&handle,                            GENERIC_READ,                            &objAttr, &ioStatusBlock,                            NULL,                            FILE_ATTRIBUTE_NORMAL,                            0,                            FILE_OPEN,                             FILE_SYNCHRONOUS_IO_NONALERT,                            NULL, 0);    if(NT_SUCCESS(ntstatus)) {        byteOffset.LowPart = byteOffset.HighPart = 0;        ntstatus = ZwReadFile(handle, NULL, NULL, NULL, &ioStatusBlock,                              buffer, BUFFER_SIZE, &byteOffset, NULL);        if(NT_SUCCESS(ntstatus)) {            buffer[BUFFER_SIZE-1] = '\0';            DbgPrint("%s\n", buffer);        }        ZwClose(handle);    }
Referências
Para obter mais informações sobre como usar arquivos em um driver, consulte a seção "Usando arquivos em um driver" Windows Driver Development Kit.

Para obter mais informações sobre o Windows Driver Development Kit, visite o seguinte site:

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 891805 - Última Revisão: 06/07/2006 18:40:46 - Revisão: 2.1

Microsoft Windows Server 2003, Datacenter Edition (32-bit x86), Microsoft Windows Server 2003, Enterprise Edition (32-bit x86), Microsoft Windows Server 2003, Standard Edition (32-bit x86), Microsoft Windows Server 2003, Web Edition, Microsoft Windows XP Professional, Microsoft Windows XP Home Edition, Microsoft Windows 2000 Professional Edition, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Server

  • kbmt kbhowto kbinfo KB891805 KbMtpt
Comentários