IRP_MJ_CREATE (filtros FS e FS)

Quando enviado

O Gerenciador de E/S envia uma solicitação de IRP_MJ_CREATE quando:

  • Um novo arquivo ou diretório está sendo criado.
  • Um arquivo, dispositivo, diretório ou volume existente está sendo aberto.

Normalmente, esse IRP é enviado em nome de um aplicativo de modo de usuário que chamou uma função do Microsoft Win32, como CreateFile ou em nome de um componente do modo kernel que chamou uma função como IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile ou ZwOpenFile.

Se a solicitação de criação for concluída com êxito, o componente aplicativo ou modo kernel receberá um identificador para o objeto de arquivo.

Operação: Drivers do sistema de arquivos

Se o objeto de dispositivo de destino for o objeto de dispositivo de controle do sistema de arquivos, a rotina de expedição do driver do sistema de arquivos deverá concluir o IRP e retornar um valor NTSTATUS apropriado, depois de definir Irp-IoStatus.Status> e Irp-IoStatus.Information> como valores apropriados.

Caso contrário, o driver do sistema de arquivos deve processar a solicitação de criação.

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

Se o objeto de dispositivo de destino for o objeto de dispositivo de controle do driver de filtro, a rotina de expedição do driver de filtro deverá concluir o IRP e retornar um valor NTSTATUS apropriado, depois de definirIrp-IoStatus.Status> e Irp-IoStatus.Information> como valores apropriados.

Caso contrário, o driver de filtro deve executar qualquer processamento necessário. Em seguida, dependendo da natureza do filtro, ele deve concluir o IRP ou passá-lo para o driver mais baixo na pilha.

Em geral, os drivers de filtro não devem retornar STATUS_PENDING em resposta a IRP_MJ_CREATE. No entanto, se um driver de nível inferior retornar STATUS_PENDING, o driver de filtro deverá passar esse valor status para cima na cadeia de driver.

Os gravadores de driver de filtro do sistema de arquivos devem observar que IoCreateStreamFileObject faz com que uma solicitação de IRP_MJ_CLEANUP seja enviada para a pilha de driver do sistema de arquivos para o volume. Como os sistemas de arquivos geralmente criam objetos de arquivo de fluxo como um efeito colateral de operações diferentes de IRP_MJ_CREATE, é difícil para os drivers de filtro detectar de forma confiável a criação de objeto de arquivo de fluxo. Portanto, um driver de filtro deve esperar receber solicitações de IRP_MJ_CLEANUP e IRP_MJ_CLOSE para objetos de arquivo não vistos anteriormente. Para IoCreateStreamFileObjectLite, uma solicitação de IRP_MJ_CLEANUP não é enviada.

Quando os drivers de filtro herdados reempõem uma solicitação de criação em um retorno de chamada pós-criação, eles devem liberar e definir o buffer associado ao ponto de nova análise (o buffer auxiliar) como NULL. Se um driver de filtro herdado não liberar esse buffer e defini-lo como NULL, o driver vai vazar memória. Os drivers de minifiltro não precisam fazer isso porque o Gerenciador de Filtros faz isso por eles.

Parâmetros

Um sistema de arquivos ou driver de filtro herdado chama IoGetCurrentIrpStackLocation com o IRP fornecido para obter um ponteiro para seu próprio local de pilha no IRP. Nos parâmetros a seguir, Irp aponta para os pontos IRP e IrpSp 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 estruturado FILE_FULL_EA_INFORMATION, se o objeto de arquivo representa um arquivo com atributos estendidos. Caso contrário, esse membro será definido como NULL.

  • Irp->Os sinalizadores são definidos como os seguintes sinalizadores para esta solicitação:

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorMode indica o modo de execução do processo que solicitou a operação, KernelMode ou UserMode. Se o sinalizador SL_FORCE_ACCESS_CHECK estiver definido, as verificações de acesso deverão ser executadas, mesmo que Irp-RequestorMode> seja KernelMode.

  • Irp->IoStatus aponta para uma estrutura IO_STATUS_BLOCK que recebe a status de conclusão final e informações sobre a operação solicitada. O sistema de arquivos define o membro Information dessa estrutura como um dos seguintes valores:

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize é o tamanho de alocação inicial, em bytes, para o arquivo. Um valor diferente de zero não tem efeito, a menos que o arquivo esteja sendo criado, substituído ou substituído.

  • IrpSp->FileObject aponta para um objeto de arquivo que o Gerenciador de E/S cria para representar o arquivo a ser criado ou aberto. Quando o sistema de arquivos processa a solicitação IRP_MJ_CREATE, ele define os campos FsContext e possivelmente FsContext2 nesse objeto de arquivo como valores específicos do sistema de arquivos. Portanto, os valores dos campos FsContext e FsContext2 não podem ser considerados válidos até que o sistema de arquivos tenha processado a solicitação de criação. Para obter mais informações, consulte Fluxos de arquivos, contextos de fluxo e contextos de Per-Stream.

    FltCancelFileOpen e IoCancelFileOpen definem o sinalizador FO_FILE_OPEN_CANCELLED no campo Flags do objeto de arquivo. Definir esse sinalizador indica que a solicitação de IRP_MJ_CREATE foi cancelada e uma solicitação de IRP_MJ_CLOSE será emitida para esse objeto de arquivo. Depois que a solicitação de criação tiver sido cancelada, ela não poderá ser reemissada.

    O parâmetro IrpSp-FileObject> contém um ponteiro para o campo RelatedFileObject, que também é uma estrutura FILE_OBJECT. O campo RelatedFileObject de uma estrutura FILE_OBJECT é usado para indicar que um determinado arquivo foi aberto em relação a um objeto de arquivo já aberto. Isso geralmente indica que o arquivo relativo é um diretório, mas arquivos baseados em fluxo podem ser abertos em relação a um fluxo já existente de um arquivo. O campo RelatedFileObject da estrutura FILE_OBJECT só é válido durante o processamento de IRP_MJ_CREATE.

  • IrpSp->Os sinalizadores podem ser definidos como um ou mais dos seguintes valores:

    Sinalizador Significado
    SL_FORCE_ACCESS_CHECK 0x01 Se esse sinalizador estiver definido, as verificações de acesso deverão ser executadas mesmo que o valor de IRP-RequestorMode> seja KernelMode.
    SL_OPEN_PAGING_FILE 0x02 Se esse sinalizador estiver definido, o arquivo será um arquivo de paginação.
    SL_OPEN_TARGET_DIRECTORY 0x04 Se esse sinalizador estiver definido, o diretório pai do arquivo deverá ser aberto.
    SL_STOP_ON_SYMLINK 0x08 Se esse sinalizador for definido, a passagem automática de junções e links simbólicos do Gerenciador de E/S será suprimida, fazendo com que as aberturas de junções e links simbólicos retornem STATUS_REPARSE.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 Se esse sinalizador estiver definido, ele permitirá a criação de um arquivo somente leitura com a opção FILE_DELETE_ON_CLOSE. Essa opção faz com que o arquivo seja excluído quando o identificador é fechado.
    SL_CASE_SENSITIVE 0x80 Se definido, as comparações de nome de arquivo devem diferenciar maiúsculas de minúsculas.
  • IrpSp->MajorFunction está definido como IRP_MJ_CREATE.

  • IrpSp->Parameters.Create.EaLength é o tamanho em bytes do buffer em Irp-AssociatedIrp.SystemBuffer>. Se o valor de Irp*->AssociatedIrp.SystemBuffer for NULL, esse membro deverá ser zero.

  • IrpSp->Parameters.Create.FileAttributes é uma máscara de bits de sinalizadores de atributo a ser aplicada ao criar ou abrir o arquivo. Atributos explicitamente especificados são aplicados somente quando o arquivo é criado, substituído ou, em alguns casos, substituído. Por padrão, esse valor é FILE_ATTRIBUTE_NORMAL, que qualquer outro sinalizador ou combinação OR'd de sinalizadores compatíveis pode substituir. Esse membro corresponde ao parâmetro FileAttributes para IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.Options é uma máscara de bits de sinalizadores que especificam as opções a serem aplicadas ao criar ou abrir o arquivo e a ação a ser executada se o arquivo já existir.

    Os 8 bits altos desse parâmetro correspondem ao parâmetro Disposition para IoCreateFileSpecifyDeviceObjectHint.

    Os 24 bits baixos desse membro correspondem ao parâmetro CreateOptions para IoCreateFileSpecifyDeviceObjectHint. Os drivers de filtro e de minifiltro do sistema de arquivos que executam a verificação de arquivos (como programas antivírus) devem prestar atenção especial ao sinalizador FILE_COMPLETE_IF_OPLOCKED. Se esse sinalizador estiver definido, o filtro não deverá bloquear ou atrasar a operação de IRP_MJ_CREATE.

    Se o sinalizador FILE_COMPLETE_IF_OPLOCKED estiver definido no caminho de pré-criação (criar expedição), o filtro não deverá iniciar nenhum dos seguintes tipos de operações, pois elas podem causar quebras de oplock:

    • IRP_MJ_CLEANUP
    • IRP_MJ_CREATE
    • IRP_MJ_FILE_SYSTEM_CONTROL
    • IRP_MJ_FLUSH_BUFFERS
    • IRP_MJ_LOCK_CONTROL
    • IRP_MJ_READ
    • IRP_MJ_SET_INFORMATION
    • IRP_MJ_WRITE

    Se um filtro ou minifiltro não puder respeitar o sinalizador de FILE_COMPLETE_IF_OPLOCKED, ele deverá concluir a solicitação de IRP_MJ_CREATE com STATUS_SHARING_VIOLATION.

    Se o sinalizador FILE_COMPLETE_IF_OPLOCKED estiver definido no caminho de conclusão (pós-criação), o filtro deverá marcar se o sistema de arquivos definiu Irp-IoStatus.Status> como o valor STATUS_OPLOCK_BREAK_IN_PROGRESS status. Se esse valor de status não estiver definido, será seguro que o filtro inicie uma das operações acima no arquivo. Se esse valor status for definido, o oplock ainda não foi quebrado e o filtro não deve iniciar nenhuma operação que possa causar uma quebra de oplock. Portanto, o filtro deve adiar todas as operações acima no arquivo até que uma das seguintes condições seja verdadeira:

    • O proprietário do oplock envia uma solicitação FSCTL_OPLOCK_BREAK_ACKNOWLEDGE para o sistema de arquivos.
    • Um componente do sistema diferente do filtro ou do minifiltro envia ao sistema de arquivos uma solicitação de E/S que deve aguardar até que a interrupção do oplock seja concluída (como IRP_MJ_READ ou IRP_MJ_WRITE). O filtro ou o minifiltro pode iniciar uma das operações acima de sua rotina de expedição (ou retorno de chamada de pré-operação) para essa nova operação, pois a rotina de retorno de chamada de expedição ou pré-operação é colocada em um estado de espera até que a interrupção do oplock seja concluída.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState> aponta para uma estrutura ACCESS_STATE que contém o contexto de assunto do objeto, os tipos de acesso concedidos e os tipos de acesso desejados restantes.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess> é uma estrutura ACCESS_MASK que especifica os direitos de acesso solicitados para o arquivo. Para obter mais informações, consulte a descrição do parâmetro DesiredAccess para IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.ShareAccess é uma máscara de bits dos direitos de acesso de compartilhamento solicitados para o arquivo. Se esse membro for zero, o acesso exclusivo será solicitado. Para obter mais informações, consulte a descrição do parâmetro ShareAccess para IoCreateFileSpecifyDeviceObjectHint.

Confira também

ACCESS_MASK

ACCESS_STATE

FILE_FULL_EA_INFORMATION

FltCancelFileOpen

FltReissueSynchronousIo

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCheckEaBufferValidity

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

IRP_MJ_CREATE (Referência de Kernel do WDK)

ZwCreateFile

ZwOpenFile