PURPOSE
Executes a single read/write instruction to an I/O port or to a
memory address.
PROTOTYPE
DWORD WD_Transfer(
HANDLE hWD,
WD_TRANSFER *pTrans);
PARAMETERS
| Name | Type | Input/Output |
|---|---|---|
| HANDLE | Input | |
| WD_TRANSFER* | ||
| DWORD | Input | |
| KPTR | Input | |
| DWORD | Input | |
| DWORD | Input | |
| DWORD | Input | |
| union | ||
| BYTE | Input/Output | |
| WORD | Input/Output | |
| UINT32 | Input/Output | |
| UINT64 | Input/Output | |
| PVOID | Input/Output |
DESCRIPTION
| Name | Description |
|---|---|
| hWD | Handle to WinDriver's kernel-mode driver as received from WD_Open() [5.2] |
| pTrans | Pointer to a transfer information structure: |
| A value indicating the type of transfer to perform - see
definition of the WD_TRANSFER_CMD enumeration in
windrvr.h. In calls to WD_Transfer() the transfer command should be a read/write transfer command that conforms to the following format: <dir><p>_[S]<size> Explanation: <dir>: R for read, W for write <p>: P for I/O, M for memory <S>: signifies a string (block) transfer, as opposed to a single transfer <size>: BYTE, WORD, DWORD or QWORD . |
|
| The memory or I/O address to access.
For a memory transfer, use the kernel-mapping of the base address received from WD_CardRegister() [2.8] in pCardReg->Card.Item[i]I.Mem.dwTransAddr (where 'i' is the index of the relevant memory item) + the desired offset from the beginning of the address range. For an I/O transfer, use the base address received from WD_CardRegister() [2.8] in pCardReg->Card.Item[i]I.IO.dwAddr (where 'i' is the index of the relevant I/O item) + the desired offset from the beginning of the address range. |
|
| Used in string transfers - number of bytes to transfer | |
| Used for string transfers. If TRUE, I/O or memory address should be incremented for transfer. If FALSE, all data is transferred to the same port/address. |
|
| Must be set to 0 | |
| The transfer data - input for read transfers, output for write transfers: | |
| Used for 8-bit transfers | |
| Used for 16-bit transfers | |
| Used for 32-bit transfers | |
| Used for 64-bit transfers | |
| Used for string (block) transfers |
RETURN VALUE
Returns WD_STATUS_SUCCESS (0) on success, or an appropriate error code otherwise [A].
REMARKS
BYTE buf[len]; /* For BYTE transfers - not aligned */
WORD buf[len]; /* For WORD transfers - aligned on 2-byte boundary */
UINT32 buf[len]; /* For DWORD transfers - aligned on 4-byte boundary */
UINT64 buf[len]; /* For QWORD transfers - aligned on 8-byte boundary */
EXAMPLE
WD_TRANSFER Trans; BYTE read_data; BZERO(Trans); Trans.cmdTrans = RP_BYTE; /* Read Port BYTE */ Trans.dwPort = 0x210; WD_Transfer(hWD, &Trans); read_data = Trans.Data.Byte;