Compartir a través de


Función IoBuildSynchronousFsdRequest (wdm.h)

La rutina IoBuildSynchronousFsdRequest asigna y configura un IRP para una solicitud de E/S procesada sincrónicamente.

Sintaxis

__drv_aliasesMem PIRP IoBuildSynchronousFsdRequest(
  [in]           ULONG            MajorFunction,
  [in]           PDEVICE_OBJECT   DeviceObject,
  [in, out]      PVOID            Buffer,
  [in, optional] ULONG            Length,
  [in, optional] PLARGE_INTEGER   StartingOffset,
  [in]           PKEVENT          Event,
  [out]          PIO_STATUS_BLOCK IoStatusBlock
);

Parámetros

[in] MajorFunction

Código de función principal para IRP. Este código puede ser IRP_MJ_PNP, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERSo IRP_MJ_SHUTDOWN.

[in] DeviceObject

Puntero a la estructura de DEVICE_OBJECT del objeto de dispositivo del controlador inferior siguiente, que representa el dispositivo de destino.

[in, out] Buffer

Puntero a un búfer de datos. Si MajorFunction es IRP_MJ_WRITE, el búfer contiene los datos que se van a escribir. Si MajorFunction es IRP_MJ_READ, el búfer recibe datos. Si MajorFunction es IRP_MJ_FLUSH_BUFFERS o IRP_MJ_SHUTDOWN, este parámetro debe ser NULL.

[in, optional] Length

Longitud, en bytes, del búfer al que apunta Búfer. Para dispositivos como discos, este valor debe ser un entero múltiplo del tamaño del sector. A partir de Windows 8, el tamaño del sector puede ser de 4096 o 512 bytes. En versiones anteriores de Windows, el tamaño del sector siempre es de 512 bytes. Este parámetro es necesario para las solicitudes de lectura y escritura, pero debe ser cero para las solicitudes de vaciado y apagado.

[in, optional] StartingOffset

Puntero al desplazamiento en el disco para las solicitudes de lectura y escritura. Las unidades y el significado de este valor son específicas del controlador. Este parámetro es necesario para las solicitudes de lectura y escritura, pero debe ser cero para las solicitudes de vaciado y apagado.

[in] Event

Puntero a un objeto de evento asignado por el autor de la llamada e inicializado. El administrador de E/S establece el evento en el estado Señalizado cuando un controlador de nivel inferior completa la operación solicitada. Después de llamar a IoCallDriver, el controlador puede esperar al objeto de evento.

[out] IoStatusBlock

Puntero a una ubicación que recibe el bloque de estado de E/S que se establece cuando el IRP se completa mediante un controlador de nivel inferior.

Valor devuelto

Si la operación se realiza correctamente, ioBuildSynchronousFsdRequest devuelve un puntero a una estructura de IRP inicializada, con la ubicación de pila de E/S del controlador siguiente inferior configurada desde los parámetros proporcionados. De lo contrario, la rutina devuelve NULL.

Observaciones

Un controlador del sistema de archivos (FSD) u otro controlador de nivel superior puede llamar a IoBuildSynchronousFsdRequest para configurar IRP que envía de forma sincrónica a controladores de nivel inferior.

IoBuildSynchronousFsdRequest asigna y configura un IRP que solicita controladores de nivel inferior para realizar una operación de lectura, escritura, vaciado o apagado sincrónicos. IrP contiene suficiente información para iniciar la operación.

Los controladores de nivel inferior pueden imponer restricciones a los parámetros proporcionados a esta rutina. Por ejemplo, los controladores de disco pueden requerir que los valores proporcionados para Longitud y StartingOffset sean múltiplos enteros del tamaño del sector del dispositivo.

Después de llamar a ioBuildSynchronousFsdRequest para crear una solicitud, el controlador debe llamar a IoCallDriver para enviar la solicitud al controlador siguiente inferior. Si ioCallDriver devuelve STATUS_PENDING, el controlador debe esperar a que se complete el IRP llamando a KeWaitForSingleObject en el evento deespecificado. La mayoría de los controladores no necesitan establecer una rutina de IoCompletion para irP.

Los IRP creados por ioBuildSynchronousFsdRequest deben completarse mediante la llamada de un controlador a IoCompleteRequest. Un controlador que llama a ioBuildSynchronousFsdRequest no debe llamar a ioFreeIrp, ya que el administrador de E/S libera estos IRP sincrónicos después de se ha llamado a ioCompleteRequest.

IoBuildSynchronousFsdRequest pone en cola los IRP que crea en una cola IRP específica del subproceso actual. Si se cierra el subproceso, el administrador de E/S cancela el IRP.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Universal
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL <= APC_LEVEL
reglas de cumplimiento de DDI ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDDIs(storport), IoBuildSynchronousFsdRequestNoFree(wdm), IoBuildSynch, IoBuildSynchronousFsdRequestWaitTimeout(wdm), PowerIrpDDis(wdm)SignalEventInCompletion(wdm)

Consulte también

IO_STACK_LOCATION

IRP

ioAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject