The REQUEST_ASYNC_READ request performs an asynchronous read operation to the device specified.

The relevant members of the IRB for this request are:

typedef struct _IRB {
  ULONG FunctionNumber;
  union {
    struct {
      IO_ADDRESS    DestinationAddress;
      ULONG         nNumberOfBytesToRead;
      ULONG         nBlockSize;
      ULONG         fulFlags;
      PMDL          Mdl;
      ULONG         ulGeneration;
      UCHAR         chPriority;
      UCHAR         nSpeed;
      UCHAR         tCode;
      ULONG         Reserved;
      ULONG         ElapsedTime;
    } AsyncRead;
  } u;
} IRB;

IRB Input




Specifies the 1394 64-bit destination address for this read operation. The driver only needs to fill in the IA_Destination_Offset member of DestinationAddress; the bus driver fills in the IA_Destination_ID member. See IO_ADDRESS for the structure description.


Specifies the number of bytes to be read from the 1394 node.


Specifies the size of each individual block within the data stream that is read as a whole from the 1394 node. If this parameter is zero, the maximum packet size for the device and speed selected is used to issue these read requests, unless raw-mode addressing is used.

If raw-mode addressing is used, the client driver should set the nBlockSize member to the maximum asynchronous payload size that is supported by the device at the connected speed.

For more information on raw-mode addressing, see Sending Asynchronous I/O Request Packets on the IEEE 1394 Bus.

Note  In Windows 7 and later versions of Windows, you can specify new values higher speed and greater sized payloads. For more information, see New Flags for Speed and Payload Size and IEEE 1394 IOCTL Changes in Device Driver Interface (DDI) Changes in Windows 7.

Specifies any nondefault settings for this operation. The following flags are provided.



When the bus driver splits the request into blocks, begin the operation for each block at the same address, rather than treating each block as consecutive sections of the device's address space. Used only in asynchronous requests larger than u.AsyncRead.nBlockSize or the maximum packet size for the current speed.


The bus driver returns the elapsed time of the operation in u.AsyncRead.ElapsedTime.



Points to an MDL that describes the device driver's buffer, which receives data from the 1394 node.


Specifies the bus reset generation as known by the device driver that submits this asynchronous request. If the generation count specified does not match the actual generation of the bus, this request is returned with an error of STATUS_INVALID_GENERATION.


Reserved. Drivers must set this to zero.


Reserved. Drivers must set this to zero.


Reserved. Drivers must set this to zero.


Reserved. Drivers must set this to zero.

IRB Output


If the driver specifies the ASYNC_FLAGS_PING flag, the bus driver returns the time required, in nanoseconds, to complete the read request.

I/O Status Block

If successful, the bus driver sets Irp->IoStatus.Status to STATUS_SUCCESS. If u.AsyncLock.ulGeneration does not match the current bus reset generation count, the bus driver sets Irp->IoStatus.Status as STATUS_INVALID_GENERATION.


A REQUEST_ASYNC_READ request reads from the device's address space, beginning at the AddressOffset member of u.AsyncRead.DestinationAddress. The buffer is broken up into blocks, and one block is read per transaction. If the ASYNC_FLAGS_NONINCREMENTING flag is set, the driver reads each block beginning at u.AsyncRead.DestinationAddress; otherwise it reads each block from successive regions in the device's memory address space.

The IEEE 1394-1995 Specification constrains the size of reads to be ASYNC_PAYLOAD_xxx_RATE, where xxx is the approximate connection speed in megabits per second. (The speeds allowed are 100, 200, and 400 Mb/s.)

Payload RateDescription


100 Mb/s


200 Mb/s


400 Mb/s


If the block size exceeds the maximum payload size, the payload size is used as the block size.

The size of packets may also be constrained by the device itself. The device reports the maximum packet size in the MAX_REC field of its configuration ROM. If this value is smaller than requested block size and the maximum payload size, the bus driver uses this as the block size.

See Also




1394.h (include 1394.h)



Send comments about this topic to Microsoft