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

Traduções deste artigo Traduções deste artigo
ID do artigo: 891805 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

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:
http://www.microsoft.com/whdc/devtools/ddk/default.mspx

Propriedades

ID do artigo: 891805 - Última revisão: quarta-feira, 7 de junho de 2006 - Revisão: 2.1
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbhowto kbinfo KB891805 KbMtpt
Tradução automática
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

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com