📄 windrvr.h
字号:
DWORD hDevice; // Handle of USB device to read from or write to.
DWORD dwPipe; // Pipe number on device.
DWORD fRead; // TRUE for read (IN) transfers; FALSE for write (OUT) transfers.
DWORD dwOptions; // USB_TRANSFER options:
// USB_TRANSFER_HALT halts the pervious transfer.
// USB_SHORT_TRANSFER - if set, WD_UsbTransfer() will return
// once a data transfer occurs (within the dwTimeout period),
// even if the device sent less data than requested in dwBytes.
PVOID pBuffer; // Pointer to buffer to read/write.
DWORD dwBytes; // Amount of bytes to transfer.
DWORD dwTimeout; // Timeout for the transfer in milliseconds. Set to 0 for infinite wait.
DWORD dwBytesTransfered; // Returns the number of bytes actually read/written
BYTE SetupPacket[8]; // Setup packet for control pipe transfer.
DWORD fOK; // TRUE if transfer succeeded.
DWORD dwStatus; // Transfer status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful transfer.
} WD_USB_TRANSFER, WD_USB_TRANSFER_V52;
typedef struct {
DWORD uniqueId; // The device unique ID.
DWORD dwConfigurationIndex; // The index of the configuration to register.
DWORD dwInterfaceNum; // Interface to register.
DWORD dwInterfaceAlternate;
DWORD hDevice; // Handle of device.
WD_USB_DEVICE_INFO Device; // Description of the device.
DWORD dwOptions; // Should be zero.
CHAR cName[32]; // Name of card.
CHAR cDescription[100]; // Description.
DWORD dwStatus; // Register status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful registration.
} WD_USB_DEVICE_REGISTER, WD_USB_DEVICE_REGISTER_V52;
typedef struct
{
DWORD hDevice;
DWORD dwPipe;
DWORD dwStatus; // Reset status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful reset.
} WD_USB_RESET_PIPE, WD_USB_RESET_PIPE_V52;
typedef enum
{
WD_INSERT = 0x1,
WD_REMOVE = 0x2,
WD_CPCI_REENUM = 0x8,
WD_POWER_CHANGED_D0 = 0x10, //power states for the power management.
WD_POWER_CHANGED_D1 = 0x20,
WD_POWER_CHANGED_D2 = 0x40,
WD_POWER_CHANGED_D3 = 0x80,
WD_POWER_SYSTEM_WORKING = 0x100,
WD_POWER_SYSTEM_SLEEPING1 = 0x200,
WD_POWER_SYSTEM_SLEEPING2 = 0x400,
WD_POWER_SYSTEM_SLEEPING3 = 0x800,
WD_POWER_SYSTEM_HIBERNATE = 0x1000,
WD_POWER_SYSTEM_SHUTDOWN = 0x2000
} WD_EVENT_ACTION;
#define WD_CPCI_INSERT (WD_INSERT | WD_CPCI_REENUM)
#define WD_CPCI_REMOVE (WD_REMOVE | WD_CPCI_REENUM)
typedef enum
{
WD_ACKNOWLEDGE = 0x1,
WD_ACCEPT_CONTROL = 0x2 // used in WD_EVENT_SEND (acknowledge)
} WD_EVENT_OPTION;
#define WD_ACTIONS_POWER (WD_POWER_CHANGED_D0 | WD_POWER_CHANGED_D1 | WD_POWER_CHANGED_D2 | \
WD_POWER_CHANGED_D3 | WD_POWER_SYSTEM_WORKING | WD_POWER_SYSTEM_SLEEPING1 | \
WD_POWER_SYSTEM_SLEEPING3 | WD_POWER_SYSTEM_HIBERNATE | WD_POWER_SYSTEM_SHUTDOWN)
#define WD_ACTIONS_ALL (WD_ACTIONS_POWER | WD_INSERT | WD_REMOVE)
typedef struct
{
DWORD handle;
DWORD dwAction; // WD_EVENT_ACTION
DWORD dwStatus; // EVENT_STATUS
DWORD dwEventId;
WD_BUS_TYPE dwCardType; //WD_BUS_PCI, WD_BUS_USB, WD_BUS_PCMCIA
DWORD hKernelPlugIn;
DWORD dwOptions; // WD_EVENT_OPTION
union
{
struct
{
WD_PCI_ID cardId;
WD_PCI_SLOT pciSlot;
} Pci;
struct
{
WD_USB_ID deviceId;
DWORD dwUniqueID;
} Usb;
struct
{
WD_PCMCIA_ID deviceId;
WD_PCMCIA_SLOT slot;
} Pcmcia;
} u;
DWORD dwEventVer;
DWORD dwNumMatchTables;
WDU_MATCH_TABLE matchTables[1];
} WD_EVENT, WD_EVENT_V622;
typedef struct
{
DWORD applications_num;
DWORD devices_num;
} WD_USAGE;
enum { WD_USB_HARD_RESET = 1 };
typedef struct
{
DWORD hDevice;
DWORD dwOptions; // USB_RESET options:
// WD_USB_HARD_RESET - will reset the device
// even if it is not disabled.
// After using this option it is advised to
// un-register the device (WD_UsbDeviceUnregister())
// and register it again - to make sure that the
// device has all its resources.
DWORD dwStatus; // Reset status code - see WD_ERROR_CODES enum definition.
// WD_USBD_STATUS_SUCCESS for a successful reset.
} WD_USB_RESET_DEVICE, WD_USB_RESET_DEVICE_V52;
typedef struct
{
WORD wVendorId;
WORD wDeviceId;
WORD wSubVendorId;
WORD wSubDeviceId;
DWORD dwOptions; // WD_MATCH_EXCLUDE
} WD_HS_MATCH_TABLE;
typedef struct {
DWORD handle;
DWORD dwOptions; // WD_CPCI_PNP_SUPPORT in case we want to use OS PnP support
DWORD dwNumMatchTables;
WD_HS_MATCH_TABLE matchTables[1];
} WD_HS_WATCH, WD_HS_WATCH_V622;
#define WD_KERNEL_DRIVER_PLUGIN_HANDLE 0xffff0000
#ifndef BZERO
#define BZERO(buf) memset(&(buf), 0, sizeof(buf))
#endif
#ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE ((HANDLE)(-1))
#endif
#ifndef CTL_CODE
#define CTL_CODE(DeviceType, Function, Method, Access) ( \
((DeviceType)<<16) | ((Access)<<14) | ((Function)<<2) | (Method) \
)
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS 1 // file & pipe
#define FILE_WRITE_ACCESS 2 // file & pipe
#endif
#if defined(LINUX) && defined(KERNEL_64BIT)
#define WD_TYPE 0
#define WD_CTL_CODE(wFuncNum) _IOC(_IOC_READ|_IOC_WRITE, WD_TYPE, wFuncNum, 0)
#define WD_CTL_DECODE_FUNC(IoControlCode) _IOC_NR(IoControlCode)
#define WD_CTL_DECODE_TYPE(IoControlCode) _IOC_TYPE(IoControlCode)
#elif defined(UNIX)
#define WD_TYPE 0
#define WD_CTL_CODE(wFuncNum) (wFuncNum)
#define WD_CTL_DECODE_FUNC(IoControlCode) (IoControlCode)
#define WD_CTL_DECODE_TYPE(IoControlCode) (WD_TYPE)
#else
// Device type
#define WD_TYPE 38200
#if defined(KERNEL_64BIT)
#define FUNC_MASK 0x400
#else
#define FUNC_MASK 0x0
#endif
#define WD_CTL_CODE(wFuncNum) CTL_CODE(WD_TYPE, (wFuncNum | FUNC_MASK), METHOD_NEITHER, FILE_ANY_ACCESS)
#define WD_CTL_DECODE_FUNC(IoControlCode) ((IoControlCode >> 2) & 0xfff)
#define WD_CTL_DECODE_TYPE(IoControlCode) DEVICE_TYPE_FROM_CTL_CODE(IoControlCode)
#endif
#if defined(LINUX)
#define WD_CTL_IS_64BIT_AWARE(IoControlCode) (_IOC_DIR(IoControlCode) & (_IOC_READ|_IOC_WRITE))
#elif defined(UNIX)
#define WD_CTL_IS_64BIT_AWARE(IoControlCode) TRUE
#else
#define WD_CTL_IS_64BIT_AWARE(IoControlCode) (WD_CTL_DECODE_FUNC(IoControlCode) & FUNC_MASK)
#endif
// WinDriver function IOCTL calls. For details on the WinDriver functions,
// see the WinDriver manual or included help files.
#define IOCTL_WD_DMA_LOCK WD_CTL_CODE(0x9a2)
#define IOCTL_WD_DMA_UNLOCK WD_CTL_CODE(0x902)
#define IOCTL_WD_TRANSFER WD_CTL_CODE(0x98c)
#define IOCTL_WD_MULTI_TRANSFER WD_CTL_CODE(0x98d)
#define IOCTL_WD_PCI_SCAN_CARDS WD_CTL_CODE(0x9a3)
#define IOCTL_WD_PCI_GET_CARD_INFO WD_CTL_CODE(0x90f)
#define IOCTL_WD_VERSION WD_CTL_CODE(0x910)
#define IOCTL_WD_PCI_CONFIG_DUMP WD_CTL_CODE(0x91a)
#define IOCTL_WD_KERNEL_PLUGIN_OPEN WD_CTL_CODE(0x91b)
#define IOCTL_WD_KERNEL_PLUGIN_CLOSE WD_CTL_CODE(0x91c)
#define IOCTL_WD_KERNEL_PLUGIN_CALL WD_CTL_CODE(0x91d)
#define IOCTL_WD_INT_ENABLE WD_CTL_CODE(0x98e)
#define IOCTL_WD_INT_DISABLE WD_CTL_CODE(0x91f)
#define IOCTL_WD_INT_COUNT WD_CTL_CODE(0x920)
#define IOCTL_WD_ISAPNP_SCAN_CARDS WD_CTL_CODE(0x924)
#define IOCTL_WD_ISAPNP_CONFIG_DUMP WD_CTL_CODE(0x926)
#define IOCTL_WD_SLEEP WD_CTL_CODE(0x927)
#define IOCTL_WD_DEBUG WD_CTL_CODE(0x928)
#define IOCTL_WD_DEBUG_DUMP WD_CTL_CODE(0x929)
#define IOCTL_WD_CARD_UNREGISTER WD_CTL_CODE(0x92b)
#define IOCTL_WD_ISAPNP_GET_CARD_INFO WD_CTL_CODE(0x92d)
#define IOCTL_WD_PCMCIA_SCAN_CARDS WD_CTL_CODE(0x996)
#define IOCTL_WD_PCMCIA_GET_CARD_INFO WD_CTL_CODE(0x997)
#define IOCTL_WD_PCMCIA_CONFIG_DUMP WD_CTL_CODE(0x998)
#define IOCTL_WD_CARD_REGISTER WD_CTL_CODE(0x9a4)
#define IOCTL_WD_INT_WAIT WD_CTL_CODE(0x94b)
#define IOCTL_WD_LICENSE WD_CTL_CODE(0x952)
#define IOCTL_WD_USB_RESET_PIPE WD_CTL_CODE(0x971)
#define IOCTL_WD_USB_RESET_DEVICE WD_CTL_CODE(0x93f)
#define IOCTL_WD_USB_SCAN_DEVICES WD_CTL_CODE(0x969)
#define IOCTL_WD_USB_TRANSFER WD_CTL_CODE(0x967)
#define IOCTL_WD_USB_DEVICE_REGISTER WD_CTL_CODE(0x968)
#define IOCTL_WD_USB_DEVICE_UNREGISTER WD_CTL_CODE(0x970)
#define IOCTL_WD_USB_GET_CONFIGURATION WD_CTL_CODE(0x974)
#define IOCTL_WD_EVENT_REGISTER WD_CTL_CODE(0x9a5)
#define IOCTL_WD_EVENT_UNREGISTER WD_CTL_CODE(0x987)
#define IOCTL_WD_EVENT_PULL WD_CTL_CODE(0x988)
#define IOCTL_WD_EVENT_SEND WD_CTL_CODE(0x989)
#define IOCTL_WD_DEBUG_ADD WD_CTL_CODE(0x964)
#define IOCTL_WD_USB_RESET_DEVICEEX WD_CTL_CODE(0x973)
#define IOCTL_WD_USAGE WD_CTL_CODE(0x976)
#define IOCTL_WDU_GET_DEVICE_DATA WD_CTL_CODE(0x9a7)
#define IOCTL_WDU_SET_INTERFACE WD_CTL_CODE(0x981)
#define IOCTL_WDU_RESET_PIPE WD_CTL_CODE(0x982)
#define IOCTL_WDU_TRANSFER WD_CTL_CODE(0x983)
#define IOCTL_WDU_HALT_TRANSFER WD_CTL_CODE(0x985)
#define IOCTL_WD_WATCH_PCI_START WD_CTL_CODE(0x9a6)
#define IOCTL_WD_WATCH_PCI_STOP WD_CTL_CODE(0x99a)
#define IOCTL_WDU_WAKEUP WD_CTL_CODE(0x98a)
#define IOCTL_WDU_RESET_DEVICE WD_CTL_CODE(0x98b)
#define IOCTL_WD_GET_DEVICE_PROPERTY WD_CTL_CODE(0x990)
#define IOCTL_WD_CARD_CLEANUP_SETUP WD_CTL_CODE(0x995)
#define IOCTL_WD_PCMCIA_CONTROL WD_CTL_CODE(0x99b)
#define IOCTL_WD_DMA_SYNC_CPU WD_CTL_CODE(0x99f)
#define IOCTL_WD_DMA_SYNC_IO WD_CTL_CODE(0x9a0)
#if defined(UNIX)
typedef struct
{
DWORD dwHeader;
PVOID pData;
DWORD dwSize;
} WD_IOCTL_HEADER;
#define WD_IOCTL_HEADER_CODE 0xa410b413UL
#endif
#if defined(__KERNEL__)
HANDLE __cdecl WD_Open(void);
void __cdecl WD_Close(HANDLE hWD);
DWORD __cdecl KP_DeviceIoControl(DWORD dwFuncNum, HANDLE h, PVOID pParam,
DWORD dwSize);
#define WD_FUNCTION(wFuncNum, h, pParam, dwSize, fWait) \
KP_DeviceIoControl(\
(DWORD) wFuncNum, h,\
(PVOID) pParam, (DWORD) dwSize\
)
#else
#if defined(UNIX)
static inline ULONG WD_FUNCTION_LOCAL( DWORD wFuncNum, HANDLE h,
PVOID pParam, DWORD dwSize, BOOL fWait)
{
WD_IOCTL_HEADER ioctl_hdr;
ioctl_hdr.dwHeader = WD_IOCTL_HEADER_CODE;
ioctl_hdr.pData = pParam;
ioctl_hdr.dwSize = dwSize;
(void)fWait;
#if defined(VXWORKS)
return (ULONG) ioctl((int)(h), wFuncNum, (int)&ioctl_hdr);
#elif defined(LINUX) || defined(SOLARIS)
return (ULONG) ioctl((int)(DWORD)(h), wFuncNum, &ioctl_hdr);
#endif
}
#if defined(VXWORKS)
#define WD_OpenLocal()\
((HANDLE)open("/windrvr6", O_RDWR, 0644))
#else
#define WD_OpenLocal()\
((HANDLE)(DWORD)open("/dev/windrvr6", O_RDWR))
#endif
#define WD_CloseLocal(h)\
close((int)(DWORD)(h))
#elif defined(WINCE) && defined(_WIN32_WCE_EMULATION)
HANDLE WINAPI WCE_EMU_WD_Open();
void WINAPI WCE_EMU_WD_Close(HANDLE hWD);
BOOL WINAPI WCE_EMU_WD_FUNCTION(DWORD wFuncNum, HANDLE h, PVOID
pParam, DWORD dwSize);
#define WD_OpenLocal() WCE_EMU_WD_Open()
#define WD_CloseLocal(h) WCE_EMU_WD_Close(h)
#define WD_FUNCTION_LOCAL(wFuncNum, h, pParam, dwSize, fWait) \
WCE_EMU_WD_FUNCTION(wFuncNum, h, pParam, dwSize)
#elif defined(WIN32) || defined(WINCE)
#define WD_CloseLocal(h)\
CloseHandle(h)
#if defined(WINCE)
#if defined(WD_CE_ENHANCED_INTR)
#include <ceddk.h>
#define InterruptDisable CE_InterruptDisable
#include <pkfuncs.h>
#undef InterruptDisable
#else
void WINAPI SetProcPermissions(DWORD dwPermissions);
#endif
#define WD_OpenLocal()\
(SetProcPermissions(0xFFFF), CreateFile(\
TEXT("WDR1:"),\
GENERIC_READ,\
FILE_SHARE_READ | FILE_SHARE_WRITE,\
NULL, OPEN_EXISTING, 0, NULL))
static DWORD WD_FUNCTION_LOCAL(DWORD wFuncNum, HANDLE h,
PVOID pParam, DWORD dwSize, BOOL fWait)
{
DWORD dwTmp;
DWORD rc = (DWORD)WD_STATUS_INVALID_WD_HANDLE;
((DWORD) DeviceIoControl(h, wFuncNum, pParam, dwSize, &rc, sizeof(DWORD),
&dwTmp, NULL));
return rc;
}
#elif defined(WIN32)
#define WD_OpenLocal()\
CreateFile(\
TEXT("\\\\.\\WINDRVR6"),\
GENERIC_READ,\
FILE_SHARE_READ | FILE_SHARE_WRITE,\
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL)
static DWORD WD_FUNCTION_LOCAL(DWORD wFuncNum, HANDLE h,
PVOID pParam, DWORD dwSize, BOOL fWait)
{
DWORD dwTmp;
HANDLE hWD = fWait ? WD_OpenLocal() : h;
DWORD rc = (DWORD)WD_STATUS_INVALID_WD_HANDLE;
if (hWD==INVALID_HANDLE_VALUE)
return (DWORD) -1;
DeviceIoControl(hWD, (DWORD) wFuncNum, (PVOID) pParam,
(DWORD) dwSize, &rc, sizeof(DWORD), &dwTmp, NULL);
if (fWait)
WD_CloseLocal(hWD);
return rc;
}
#endif
#endif
#define WD_FUNCTION WD_FUNCTION_LOCAL
#define WD_Close WD_CloseLocal
#define WD_Open WD_OpenLocal
#endif
#define SIZE_OF_WD_DMA(pDma) \
((DWORD)(sizeof(WD_DMA) + ((pDma)->dwPages <= WD_DMA_PAGES ? 0 : ((pDma)->dwPages - WD_DMA_PAGES) * sizeof(WD_DMA_PAGE))))
#define SIZE_OF_WD_EVENT(pEvent) \
((DWORD)(sizeof(WD_EVENT) + sizeof(WDU_MATCH_TABLE) * ((pEvent)->dwNumMatchTables - 1)))
#define SIZE_OF_WD_HS_WATCH(pHsWatch) \
((DWORD)(sizeof(WD_HS_WATCH) + sizeof(WD_HS_MATCH_TABLE) * ((pHsWatch)->dwNumMatchTables - 1)))
#define WD_Debug(h,pDebug)\
WD_FUNCTION(IOCTL_WD_DEBUG, h, pDebug, sizeof (WD_DEBUG), FALSE)
#define WD_DebugDump(h,pDebugDump)\
WD_FUNCTION(IOCTL_WD_DEBUG_DUMP, h, pDebugDump, sizeof (WD_DEBUG_DUMP), FALSE)
#define WD_DebugAdd(h, pDebugAdd)\
WD_FUNCTION(IOCTL_WD_DEBUG_ADD, h, pDebugAdd, sizeof(WD_DEBUG_ADD), FALSE)
#define WD_Transfer(h,pTransfer)\
WD_FUNCTION(IOCTL_WD_TRANSFER, h, pTransfer, sizeof (WD_TRANSFER), FALSE)
#define WD_MultiTransfer(h,pTransferArray,dwNumTransfers)\
WD_FUNCTION(IOCTL_WD_MULTI_TRANSFER, h, pTransferArray, sizeof (WD_TRANSFER) * (dwNumTransfers), FALSE)
#define WD_DMALock(h,pDma)\
WD_FUNCTION(IOCTL_WD_DMA_LOCK, h, pDma, SIZE_OF_WD_DMA(pDma), FALSE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -