IRP_MJ_WRITE (FS e drivers de filtro)

Quando enviado

O Gerenciador de E/S ou um driver do sistema de arquivos envia a solicitação IRP_MJ_WRITE. Essa solicitação pode ser enviada, por exemplo, quando um aplicativo de modo de usuário tiver chamado uma função Win32, como WriteFile ou quando um componente do modo kernel tiver chamado ZwWriteFile.

Operação: Drivers do sistema de arquivos

O driver do sistema de arquivos deve extrair e decodificar o objeto de arquivo para determinar os parâmetros e o código de função secundária.

Para solicitações de gravação MDL, o sistema de arquivos deve marcar o código de função secundária para determinar qual operação é solicitada. A seguir estão os códigos de função secundária válidos, que só podem ser usados para E/S de arquivo armazenado em cache:

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Para obter mais informações sobre como lidar com esse IRP, estude o exemplo FASTFAT incluído no WDK (Windows Driver Kit).

Operação: Drivers de filtro do sistema de arquivos herdado

O driver de filtro deve executar qualquer processamento necessário e, dependendo da natureza do filtro, executar uma das seguintes ações:

  • Concluir ou falhar o IRP ou
  • Passe o IRP para baixo para o driver mais baixo na pilha.

Parâmetros

Um sistema de arquivos ou driver de filtro chama IoGetCurrentIrpStackLocation para o IRP fornecido para obter um ponteiro para seu próprio local de pilha no IRP. Nos parâmetros a seguir, Irp aponta para o IRP e IrpSp aponta para o IO_STACK_LOCATION. O driver pode usar as informações definidas nos seguintes membros do IRP e no local da pilha IRP para processar uma solicitação de criação:

  • DeviceObject é um ponteiro para o objeto de dispositivo de destino.

  • Irp->AssociatedIrp.SystemBuffer aponta para um buffer fornecido pelo sistema a ser usado como um buffer de sistema intermediário, se o sinalizador DO_BUFFERED_IO estiver definido em DeviceObject-Flags>. Caso contrário, esse membro será definido como NULL.

  • Irp->O IoStatus aponta para uma estrutura de IO_STATUS_BLOCK que recebe o status de conclusão final e informações sobre a operação solicitada. Se a solicitação IRP_MJ_WRITE falhar, a rotina de expedição de gravação do sistema de arquivos retornará um valor NTSTATUS de erro e o valor de Irp-IoStatus.Information> será indefinido e não deverá ser usado.

  • Irp->MdlAddress é o endereço de uma MDL (lista de descritores de memória) que descreve as páginas nas quais os dados devem ser gravados.

  • IrpSp->FileObject aponta para o objeto de arquivo associado a DeviceObject. Se o sinalizador FO_SYNCHRONOUS_IO estiver definido em IrpSp-FileObject-Flags>>, o objeto de arquivo será aberto para E/S síncrona.

    O parâmetro IrpSp-FileObject> contém um ponteiro para o campo RelatedFileObject, que também é uma estrutura FILE_OBJECT. O campo RelatedFileObject da estrutura FILE_OBJECT não é válido durante o processamento de IRP_MJ_WRITE e não deve ser usado.

  • IrpSp->Sinalizadores: se o sinalizador SL_FORCE_DIRECT_WRITE estiver definido, os drivers do modo kernel poderão gravar em áreas de volume em que normalmente não podem gravar devido ao bloqueio de gravação direta. O bloqueio de gravação direta foi implementado por motivos de segurança no Windows Vista e em sistemas operacionais posteriores. Esse sinalizador é verificado na camada do sistema de arquivos e na camada de pilha de armazenamento. Para obter mais informações sobre o bloqueio direto de gravação, consulte Bloqueando operações de gravação direta em volumes e discos. O sinalizador SL_FORCE_DIRECT_WRITE está disponível no Windows Vista e em versões posteriores do Windows.

  • IrpSp->MajorFunction é definido como IRP_MJ_WRITE.

  • IrpSp->MinorFunction especifica a operação que está sendo solicitada e contém um dos seguintes:

    • IRP_MN_COMPLETE
    • IRP_MN_COMPLETE_MDL
    • IRP_MN_COMPLETE_MDL_DPC
    • IRP_MN_COMPRESSED
    • IRP_MN_DPC
    • IRP_MN_MDL
    • IRP_MN_MDL_DPC
    • IRP_MN_NORMAL
  • IrpSp->Parameters.Write.ByteOffset é uma variável LARGE_INTEGER que especifica o deslocamento de bytes inicial dentro do arquivo dos dados a serem gravados.

    Em determinadas circunstâncias, esse parâmetro pode conter um valor especial. Por exemplo, quando true, a seguinte condição indica que o final atual do arquivo deve ser usado em vez de um valor de deslocamento de arquivo explícito: IrpSp-Parameters.Write.ByteOffset.LowPart> == FILE_WRITE_TO_END_OF_FILE e IrpSp-Parameters.Write.ByteOffset.HighPart> == -1

  • IrpSp->Parameters.Write.Key é o valor da chave associado a um bloqueio de intervalo de bytes no arquivo de destino.

  • IrpSp->Parameters.Write.Length é o comprimento em bytes dos dados a serem gravados. Se a operação de gravação for bem-sucedida, o número de bytes gravados será retornado no membro Informações do IO_STATUS_BLOCK estrutura apontada por Irp-IoStatus>.

Comentários

Sistemas de arquivos arredondam operações de gravação e leitura no final do arquivo até um múltiplo do tamanho do setor do dispositivo de armazenamento de arquivos subjacente. Quando os filtros processam operações de pré-leitura ou pré-gravação, esses filtros que alocam e trocam buffers precisam arredondar o tamanho de um buffer alocado para um múltiplo do tamanho do setor do dispositivo associado. Se não o fizerem, o comprimento dos dados transferidos do sistema de arquivos subjacente excederá o comprimento alocado do buffer. Para obter mais informações sobre como trocar buffers, consulte SwapBuffers Minifilter Sample.

Confira também

CcMdlWriteComplete

CcPrepareMdlWrite

FLT_IO_PARAMETER_BLOCK

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ

IRP_MJ_WRITE (Referência de Kernel do WDK)

ZwWriteFile