IRP_MJ_CREATE (filtros FS y FS)

Cuándo se envió

El Administrador de E/S envía una solicitud de IRP_MJ_CREATE cuando:

  • Se está creando un nuevo archivo o directorio.
  • Se está abriendo un archivo, un dispositivo, un directorio o un volumen existentes.

Normalmente, este IRP se envía en nombre de una aplicación en modo de usuario que ha llamado a una función de Microsoft Win32, como CreateFile o en nombre de un componente en modo kernel que ha llamado a una función como IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile o ZwOpenFile.

Si la solicitud de creación se completa correctamente, la aplicación o el componente en modo kernel recibe un identificador para el objeto de archivo.

Operación: controladores del sistema de archivos

Si el objeto de dispositivo de destino es el objeto de dispositivo de control del sistema de archivos, la rutina de distribución del controlador del sistema de archivos debe completar el IRP y devolver un valor NTSTATUS adecuado, después de establecer Irp-IoStatus.Status> e Irp-IoStatus.Information> en los valores adecuados.

De lo contrario, el controlador del sistema de archivos debe procesar la solicitud de creación.

Operación: controladores de filtro del sistema de archivos heredados

Si el objeto de dispositivo de destino es el objeto de dispositivo de control del controlador de filtro, la rutina de distribución del controlador de filtro debe completar el IRP y devolver un valor NTSTATUS adecuado, después de establecerIrp-IoStatus.Status> e Irp-IoStatus.Information> en los valores adecuados.

De lo contrario, el controlador de filtro debe realizar cualquier procesamiento necesario. A continuación, en función de la naturaleza del filtro, debe completar el IRP o pasarlo al controlador inferior siguiente de la pila.

Por lo general, los controladores de filtro no deben devolver STATUS_PENDING en respuesta a IRP_MJ_CREATE. Sin embargo, si un controlador de nivel inferior devuelve STATUS_PENDING, el controlador de filtro debe pasar este valor de estado por la cadena de controladores.

Los escritores de controladores de filtro del sistema de archivos deben tener en cuenta que IoCreateStreamFileObject hace que se envíe una solicitud de IRP_MJ_CLEANUP a la pila de controladores del sistema de archivos para el volumen. Dado que los sistemas de archivos suelen crear objetos de archivo de secuencia como un efecto secundario de las operaciones distintas de IRP_MJ_CREATE, es difícil que los controladores de filtro detecten de forma confiable la creación de objetos de archivo de secuencia. Por lo tanto, un controlador de filtro debe esperar recibir IRP_MJ_CLEANUP y IRP_MJ_CLOSE solicitudes de objetos de archivo no vistos previamente. Para IoCreateStreamFileObjectLite, no se envía una solicitud de IRP_MJ_CLEANUP .

Cuando los controladores de filtro heredados vuelven a emitir una solicitud de creación en una devolución de llamada posterior a la creación, deben liberar y establecer el búfer asociado a su punto de reanálisis (el búfer auxiliar) en NULL. Si un controlador de filtro heredado no libera este búfer y lo establece en NULL, el controlador perderá memoria. Los controladores de minifiltro no tienen que hacerlo porque el Administrador de filtros lo hace para ellos.

Parámetros

Un sistema de archivos o un controlador de filtro heredado llama a IoGetCurrentIrpStackLocation con el IRP especificado para obtener un puntero a su propia ubicación de pila en irP. En los parámetros siguientes, Irp apunta a IRP e IrpSp apunta al IO_STACK_LOCATION. El controlador puede usar la información que se establece en los siguientes miembros del IRP y la ubicación de pila de IRP para procesar una solicitud de creación.

  • DeviceObject es un puntero al objeto de dispositivo de destino.

  • Irp->AssociatedIrp.SystemBuffer apunta a un búfer estructurado FILE_FULL_EA_INFORMATION, si el objeto de archivo representa un archivo con atributos extendidos. De lo contrario, este miembro se establece en NULL.

  • Irp->Las marcas se establecen en las marcas siguientes para esta solicitud:

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorMode indica el modo de ejecución del proceso que solicitó la operación, ya sea KernelMode o UserMode. Si se establece la marca SL_FORCE_ACCESS_CHECK, se deben realizar comprobaciones de acceso, incluso si Irp-RequestorMode> es KernelMode.

  • Irp->IoStatus apunta a una estructura de IO_STATUS_BLOCK que recibe el estado de finalización final e información sobre la operación solicitada. El sistema de archivos establece el miembro Information de esta estructura en uno de los valores siguientes:

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize es el tamaño de asignación inicial, en bytes, para el archivo. Un valor distinto de cero no tiene ningún efecto a menos que se cree, sobrescriba o sustituya el archivo.

  • IrpSp->FileObject apunta a un objeto de archivo que el Administrador de E/S crea para representar el archivo que se va a crear o abrir. Cuando el sistema de archivos procesa la solicitud de IRP_MJ_CREATE, establece los campos FsContext y, posiblemente , FsContext2 de este objeto de archivo en valores específicos del sistema de archivos. Por lo tanto, los valores de los campos FsContext y FsContext2 no se pueden considerar válidos hasta después de que el sistema de archivos haya procesado la solicitud de creación. Para obtener más información, vea Secuencias de archivos, contextos de flujo y contextos de Per-Stream.

    FltCancelFileOpen e IoCancelFileOpen establecen la marca FO_FILE_OPEN_CANCELLED en el campo Flags del objeto de archivo. Establecer esta marca indica que se ha cancelado la solicitud de IRP_MJ_CREATE y se emitirá una solicitud de IRP_MJ_CLOSE para este objeto de archivo. Una vez cancelada la solicitud de creación, no se puede volver a emitir.

    El parámetro IrpSp-FileObject> contiene un puntero al campo RelatedFileObject, que también es una estructura FILE_OBJECT. El campo RelatedFileObject de una estructura de FILE_OBJECT se usa para indicar que se ha abierto un archivo determinado con respecto a un objeto de archivo ya abierto. Esto suele indicar que el archivo relativo es un directorio, pero los archivos basados en secuencias se pueden abrir en relación con una secuencia ya existente de un archivo. El campo RelatedFileObject de la estructura FILE_OBJECT solo es válido durante el procesamiento de IRP_MJ_CREATE.

  • IrpSp->Las marcas se pueden establecer en uno o varios de los valores siguientes:

    Marca Significado
    SL_FORCE_ACCESS_CHECK 0x01 Si se establece esta marca, se deben realizar comprobaciones de acceso incluso si el valor de IRP-RequestorMode> es KernelMode.
    SL_OPEN_PAGING_FILE 0x02 Si se establece esta marca, el archivo es un archivo de paginación.
    SL_OPEN_TARGET_DIRECTORY 0x04 Si se establece esta marca, se debe abrir el directorio primario del archivo.
    SL_STOP_ON_SYMLINK 0x08 Si se establece esta marca, se suprime el recorrido automático del Administrador de E/S de uniones y vínculos simbólicos, lo que hace que se abran las uniones y los vínculos simbólicos para devolver STATUS_REPARSE.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 Si se establece esta marca, permite la creación de un archivo de solo lectura con la opción FILE_DELETE_ON_CLOSE. Esta opción hace que el archivo se elimine cuando se cierra el identificador.
    SL_CASE_SENSITIVE 0x80 Si se establece, las comparaciones de nombres de archivo deben distinguir mayúsculas de minúsculas.
  • IrpSp->MajorFunction se establece en IRP_MJ_CREATE.

  • IrpSp->Parameters.Create.EaLength es el tamaño en bytes del búfer en Irp-AssociatedIrp.SystemBuffer>. Si el valor de Irp*->AssociatedIrp.SystemBuffer es NULL, este miembro debe ser cero.

  • IrpSp->Parameters.Create.FileAttributes es una máscara de bits de las marcas de atributo que se aplicarán al crear o abrir el archivo. Los atributos especificados explícitamente solo se aplican cuando el archivo se crea, reemplaza o, en algunos casos, se sobrescribe. De forma predeterminada, este valor es FILE_ATTRIBUTE_NORMAL, que cualquier otra marca o combinación or'd de marcas compatibles puede invalidar. Este miembro corresponde al parámetro FileAttributes a IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.Options es una máscara de bits de marcas que especifican las opciones que se aplicarán al crear o abrir el archivo, y la acción que se realizará si el archivo ya existe.

    Los 8 bits altos de este parámetro corresponden al parámetro Disposition a IoCreateFileSpecifyDeviceObjectHint.

    Los 24 bits bajos de este miembro corresponden al parámetro CreateOptions a IoCreateFileSpecifyDeviceObjectHint. Los controladores de filtro y minifiltro del sistema de archivos que realizan el examen de archivos (como programas antivirus) deben prestar especial atención a la marca FILE_COMPLETE_IF_OPLOCKED. Si se establece esta marca, el filtro no debe bloquear ni retrasar la operación de IRP_MJ_CREATE.

    Si la marca FILE_COMPLETE_IF_OPLOCKED se establece en la ruta de acceso anterior a la creación (creación de distribución), el filtro no debe iniciar ninguno de los siguientes tipos de operaciones, ya que pueden provocar interrupciones de bloqueo de operación:

    • 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

    Si un filtro o minifiltro no puede respetar la marca FILE_COMPLETE_IF_OPLOCKED, debe completar la solicitud de IRP_MJ_CREATE con STATUS_SHARING_VIOLATION.

    Si la marca de FILE_COMPLETE_IF_OPLOCKED se establece en la ruta de acceso de finalización (posterior a la creación), el filtro debe comprobar si el sistema de archivos ha establecido Irp-IoStatus.Status> en el valor de estado STATUS_OPLOCK_BREAK_IN_PROGRESS. Si no se establece este valor de estado, es seguro que el filtro inicie una de las operaciones anteriores en el archivo. Si se establece este valor de estado, el interbloqueo aún no se ha roto y el filtro no debe iniciar ninguna operación que pueda provocar una interrupción del interbloqueo de operación. Por lo tanto, el filtro debe posponer todas las operaciones anteriores en el archivo hasta que se cumple una de las condiciones siguientes:

    • El propietario del interbloqueo envía una solicitud de FSCTL_OPLOCK_BREAK_ACKNOWLEDGE al sistema de archivos.
    • Un componente del sistema distinto del filtro o minifiltro envía al sistema de archivos una solicitud de E/S que debe esperar hasta que se complete la interrupción del interbloqueo de operación (por ejemplo, IRP_MJ_READ o IRP_MJ_WRITE). El filtro o minifiltro puede iniciar una de las operaciones anteriores desde su rutina de devolución de llamada de envío (o preoperación) para esta nueva operación, ya que la rutina de devolución de llamada de envío o preoperación se coloca en un estado de espera hasta que se complete la interrupción de oplock.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState> apunta a una estructura de ACCESS_STATE que contiene el contexto de asunto del objeto, los tipos de acceso concedidos y los tipos de acceso deseados restantes.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess> es una estructura de ACCESS_MASK que especifica los derechos de acceso solicitados para el archivo. Para obtener más información, vea la descripción del parámetro DesiredAccess para IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.ShareAccess es una máscara de bits de los derechos de acceso a recursos compartidos solicitados para el archivo. Si este miembro es cero, se solicita acceso exclusivo. Para obtener más información, vea la descripción del parámetro ShareAccess para IoCreateFileSpecifyDeviceObjectHint.

Consulte también

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 (referencia del kernel de WDK)

ZwCreateFile

ZwOpenFile