?? tdiclient.h
字號:
//**************************************************************************************************//
//* *//
//* Copyright (C) 2003, James Antognini, antognini@mindspring.com. *//
//* *//
//**************************************************************************************************//
#define JADrvNm "TDIClient"
#define JADrvNmW L"TDIClient"
#define wcharTcpDevName L"\\Device\\Tcp"
#define wcharUdpDevName L"\\Device\\Udp"
#define arraysize(p) (sizeof(p)/sizeof((p)[0]))
#define TDIClnDNSPort 53
#ifdef JADriverKernelMode
#define DrvTestWait(prefix) /* Wait for signalling, after saying where event is located. */ \
/* Parameter prefix may be "" but otherwise prefixes message.*/ \
{ \
KEVENT tmpEvent; \
KeInitializeEvent(&tmpEvent, NotificationEvent, FALSE); \
DbgPrint((prefix "Event at 0x%08X, and waiting ...\n",&tmpEvent)); \
KeWaitForSingleObject(&tmpEvent, Executive, KernelMode, FALSE, 0); \
}
#define INVALID_HANDLE_VALUE ((HANDLE)(LONG_PTR)-1)
#if DBG
#define DbgPrint(arg) DbgPrint arg
#else
#define DbgPrint(arg)
#endif
//***************************************************************************//
// //
// Types, definitions, etc. //
// //
//***************************************************************************//
typedef struct _TDIClnReqElem // TDI request element.
{
KEVENT RecvEvent; // Event associated with Receive request.
PCHAR pBuffer; // Addr of buffer for request.
ULONG ulBuffer; // Size of buffer.
ULONG ulBytesReceived; // Number of bytes received, set by TDIClnEventReceive() or TDIClnIoCompRtnRecv().
IO_STATUS_BLOCK ReqIoStatus; // I/O status block.
}
TDIClnReqElem, * pTDIClnReqElem;
// Next fixes a problem (C2501) in the _TDIClnConn typdef struct.
typedef struct _TDI_CONNECTION_INFORMATION * PTDI_CONNECTION_INFORMATION;
typedef struct _TDIClientExtension * pTDIClientExtension;
typedef struct _TDIClnConn
{ // Connection structure.
pTDIClientExtension pDevExt; // Pointer to device extension of TDI client.
HANDLE hConn; // Handle to connection endpoint.
PFILE_OBJECT pConnFileObj; // Address of file object for connection endpoint.
PTDI_CONNECTION_INFORMATION // Not used.
pServerConnInfo;
PTDI_CONNECTION_INFORMATION // Client connection information
pClientConnInfo;
pTDIClnReqElem pReqElemsArr; // Pointer to array of request elements.
KEVENT AccEvent;
KEVENT DiscEvent;
LONG IdxReqElemAvail; // Index of first available request element.
BOOLEAN bConnd;
}
TDIClnConn, * pTDIClnConn;
typedef struct _ConnParms
{
pTDIClientExtension pDevExt;
PTDI_CONNECTION_INFORMATION
pServerConnInfo;
PTDI_CONNECTION_INFORMATION
pClientConnInfo;
}
ConnParms, * pConnParms;
typedef struct _TDIClientExtension // Device extension of TDI client.
{
UNICODE_STRING JAUniSymLinkName;
UNICODE_STRING JAUniDeviceName;
UNICODE_STRING JARegPath;
ANSI_STRING JADriverName;
PIRP pIrpAccept;
HANDLE hAddr;
PDEVICE_OBJECT pTcpDevObj;
PDEVICE_OBJECT pUdpDevObj;
PFILE_OBJECT pAddrFileObj;
PCHAR pBufferBase;
pTDIClnReqElem pReqElemsArr;
pTDIClnConn pTDIClnConnArr;
ULONG DNSIPAddr[4];
}
TDIClientExtension, * pTDIClientExtension;
//***************************************************************************//
// //
// Routine prototypes. //
// //
//***************************************************************************//
typedef struct _TDIClientExtension * pTDIClientExtension;
typedef struct _TDIClientTestStr * pTDIClientTestStr;
NTSTATUS
TDIClientDispatchAny(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS
TDIClientMain(IN pTDIClientExtension, IN pTDIClientTestStr);
VOID
TDIClientUnload(IN PDRIVER_OBJECT);
ULONG
GetInetAddr(IN LPWSTR, OUT LPWSTR *);
NTSTATUS
TDIClnOpenTransAddr(PWSTR, PHANDLE, PFILE_OBJECT *, USHORT);
NTSTATUS
TDIClnOpenConnEndPt(pTDIClnConn, pTDIClientExtension);
NTSTATUS
TDIClnSetEventHandler(PFILE_OBJECT, PDEVICE_OBJECT, LONG, PVOID, PVOID);
NTSTATUS
TDIClnAssocAddr(PFILE_OBJECT, PDEVICE_OBJECT, HANDLE);
NTSTATUS
TDIClnDisassocAddr(PFILE_OBJECT, PDEVICE_OBJECT);
NTSTATUS
TDIClnConnect(PFILE_OBJECT, PDEVICE_OBJECT, ULONG, USHORT);
NTSTATUS
TDIClnSend(PFILE_OBJECT, PDEVICE_OBJECT, PVOID, ULONG);
NTSTATUS
TDIClnRecv(PFILE_OBJECT, PDEVICE_OBJECT, PVOID, ULONG, PIO_STATUS_BLOCK, PVOID);
NTSTATUS
TDIClnSendDGram(PFILE_OBJECT, PDEVICE_OBJECT, PTDI_CONNECTION_INFORMATION, PVOID, ULONG);
NTSTATUS
TDIClnRecvDGram(PFILE_OBJECT, PDEVICE_OBJECT, PTDI_CONNECTION_INFORMATION, PVOID, ULONG, PIO_STATUS_BLOCK);
NTSTATUS
TDIClnDisconnect(PFILE_OBJECT, PDEVICE_OBJECT);
// Next fixes a problem (C2501) in the TDIClnEventDisconnect definition.
typedef PVOID CONNECTION_CONTEXT;
NTSTATUS
TDIClnEventDisconnect(PVOID, CONNECTION_CONTEXT, LONG, PVOID, LONG, PVOID, ULONG);
NTSTATUS
TDIClnEventConnect(PVOID, LONG, PVOID, LONG, PVOID, LONG, PVOID, CONNECTION_CONTEXT *, PIRP *);
NTSTATUS
TDIClnEventErrorEx(PVOID, NTSTATUS, PVOID);
NTSTATUS
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -