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

El código de función principal del IRP. Este código puede ser IRP_MJ_PNP, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERS o IRP_MJ_SHUTDOWN.

[in] DeviceObject

Puntero a la estructura DEVICE_OBJECT para el 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 está 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 buffer. Para dispositivos como discos, este valor debe ser un número 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 un controlador de nivel inferior completa el IRP.

Valor devuelto

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

Comentarios

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ónica. El IRP contiene suficiente información para iniciar la operación.

Los controladores de nivel inferior pueden imponer restricciones en los parámetros proporcionados a esta rutina. Por ejemplo, los controladores de disco pueden requerir que los valores proporcionados para Length 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 inferior siguiente. Si IoCallDriver devuelve STATUS_PENDING, el controlador debe esperar a que se complete el IRP llamando a KeWaitForSingleObject en el evento especificado. La mayoría de los controladores no necesitan establecer una rutina de IoCompletion para irP.

Las IRP creadas por IoBuildSynchronousFsdRequest deben completarse mediante la llamada de un controlador a IoCompleteRequest. Un controlador que llama a IoBuildSynchronousFsdRequest no debe llamar a IoFreeIrp, porque el administrador de E/S libera estas IRP sincrónicas después de llamar 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 Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Reglas de cumplimiento de DDI ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDIs(storport), IoBuildSynchronousFsdRequestNoFree(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), PowerIrpDDis(wdm), SignalEventInCompletion(wdm)

Consulte también

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject