main.h
上传用户:zanmei2
上传日期:2010-03-06
资源大小:775k
文件大小:9k
源码类别:

通讯编程文档

开发平台:

C/C++

  1. /*++
  2. Copyright (c) 2005  Changzhi Zhou All Rights Reserved
  3. Module Name:
  4.     main.h
  5. Abstract:
  6.    Declaration for all functions.
  7.    Define all structures.
  8. Environment:
  9.     Kernel mode
  10. Revision History:
  11. Changzhi Zhou Dec 20  2004
  12. --*/
  13. //#if !defined(_FILTER_H_)
  14. //#define _FILTER_H_
  15. #ifndef __MAIN_H_
  16. #define __MAIN_H_
  17. #include <csq.h> // Include this header file and link with csq.lib to use this sample on Win2K.
  18. #include "tdi.h"
  19. #define DRIVERNAME "Sample: "
  20. #define ORIGINALDATA_SIZE 65536
  21. #if DBG
  22. #define DebugPrint(_x_) 
  23.                DbgPrint (DRIVERNAME); 
  24.                DbgPrint _x_;
  25. #define TRAP() DbgBreakPoint()
  26. #else
  27. #define DebugPrint(_x_)
  28. #define TRAP()
  29. #endif
  30. #if DBG
  31. #define CSAMP_KDPRINT(_x_) 
  32.                 DbgPrint("CancelIrp.c: ");
  33.                 DbgPrint _x_;
  34. #else
  35. #define CSAMP_KDPRINT(_x_)
  36. #endif
  37. #include "wmilib.h"
  38. #include <ntddser.h>
  39. #define DEVICE_OBJECT_NAME_LENGTH 128
  40. #define DOS_DEVICE_NAME L"\DosDevices\COM"
  41. #define SYMBOLIC_NAME_LENGTH 128
  42. #define SERIAL_DEVICE_MAP L"SERIALCOMM"
  43. #define DEVICE_NAME L"\Device\Serial"
  44. #define RINGBUFFER_SIZE 65536
  45. #define RINGBUFFER_SIZE_80FULL 52428
  46. #define RECVREMAINDER_BUFFER_SIZE 65536
  47. // read interval timeout 1 second
  48. #define READINTERVAL_TIMEOUT 10000000
  49. //
  50. // These are the states Filter transition to upon
  51. // receiving a specific PnP Irp. Refer to the PnP Device States
  52. // diagram in DDK documentation for better understanding.
  53. //
  54. typedef enum _DEVICE_PNP_STATE {
  55.     NotStarted,         // not started
  56.     Stopped,            // device stopped
  57.     Working,            // started and working
  58. //Connecting,
  59.     PendingStop,        // stop pending
  60.     PendingRemove,      // remove pending
  61.     SurpriseRemoved,    // removed by surprise
  62.     Removed             // removed
  63. } DEVICE_PNP_STATE;
  64. #define INITIALIZE_PNP_STATE(_Data_)    
  65.         (_Data_)->DevicePnPState =  NotStarted;
  66.         (_Data_)->PreviousPnPState = NotStarted;
  67. #define SET_NEW_PNP_STATE(_Data_, _state_) 
  68. KeAcquireSpinLock( &(_Data_)->DevStateLock, &oldIrql );
  69.         (_Data_)->PreviousPnPState =  (_Data_)->DevicePnPState;
  70.         (_Data_)->DevicePnPState = (_state_);
  71. KeReleaseSpinLock( &(_Data_)->DevStateLock, oldIrql );
  72. #define RESTORE_PREVIOUS_PNP_STATE(_Data_)   
  73. KeAcquireSpinLock( &(_Data_)->DevStateLock, &oldIrql );
  74.         (_Data_)->DevicePnPState =   (_Data_)->PreviousPnPState;
  75. KeReleaseSpinLock( &(_Data_)->DevStateLock, oldIrql );
  76. typedef struct _RecvContext{
  77. PIRP pIrp;
  78. PMDL pMdl;
  79. BOOLEAN bLocked;
  80. IO_STATUS_BLOCK IoStatus;
  81. KEVENT Event;
  82. TDI_CONNECTION_INFORMATION  ReceiveDatagramInfo;
  83.     TDI_CONNECTION_INFORMATION  ReturnInfo;
  84. PVOID RemainderBuffer;
  85. }RECV_CONTEXT, *PRECV_CONTEXT;
  86. typedef struct _DEVICE_EXTENSION
  87. {
  88. // regular varialbes
  89.     PDEVICE_OBJECT Self;
  90.     PDEVICE_OBJECT NextLowerDriver;
  91. // PnP state
  92.     DEVICE_PNP_STATE DevicePnPState;
  93.     DEVICE_PNP_STATE PreviousPnPState;
  94.     // obtain and hold this lock while changing the device state,
  95.     // the queue state and while processing the queue.
  96. KSPIN_LOCK DevStateLock;
  97. // relevant to PnP
  98.     KEVENT RemoveEvent;
  99.     KEVENT StopEvent;
  100. ULONG OutStandingIO;
  101.     KSPIN_LOCK IOCountLock;
  102. BOOLEAN bIsOpen;
  103. // Names
  104.     UNICODE_STRING      InterfaceName; // The name returned from IoRegisterDeviceInterface,
  105. UNICODE_STRING DeviceName;
  106. UNICODE_STRING SymbolicLinkName;
  107. UNICODE_STRING DosName;
  108. ULONG ComX;
  109. BOOLEAN CreatedSymbolicLink;
  110. BOOLEAN CreatedSerialCommEntry;
  111. KSPIN_LOCK ThreadSpinLock; // Spinlock for threads
  112. // relevant to Serial Port
  113. ULONG CurrentBaud;
  114. SERIAL_TIMEOUTS Timeouts;
  115. SERIAL_LINE_CONTROL LineControl;
  116.     SERIAL_CHARS SpecialChars;
  117. SERIAL_STATUS SerialStatus;
  118. ULONG BufferSize;
  119.     SERIAL_HANDFLOW HandFlow;
  120. ULONG WaitMask;
  121. PIRP WaitOnMaskIrp;
  122. PIRP PendingReadIrp;
  123. KTIMER ReadTimer;
  124. KDPC ReadDpc;
  125. // relevant to read/write buffer
  126. PUCHAR RxBuffer;
  127. PUCHAR lpRead;
  128. PUCHAR lpRx;
  129.     //  SpinLock to protect access to the queue
  130. /*    KSPIN_LOCK QueueLock;
  131.     IO_CSQ CancelSafeQueue;
  132.     // Irps waiting to be processed are queued here
  133.     LIST_ENTRY PendingIrpQueue;
  134. */
  135. // variables about TDI client
  136. HANDLE hTransAddr;
  137. PFILE_OBJECT lpTransAddrFileObject;
  138. PDEVICE_OBJECT TDILowerDeviceObject;
  139. RECV_CONTEXT recvContext;
  140. USHORT RemotePort;
  141. ULONG RemoteAddress;
  142. // WMI
  143.     WMILIB_CONTEXT      WmiLibInfo;     // WMI Information
  144. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
  145. #if 0
  146. typedef struct _ProcContext{
  147. PDEVICE_EXTENSION deviceExtension;
  148. PIRP GetTimeIrp;
  149. KTIMER Timer;
  150. KDPC dpc;
  151. }PROC_CONTEXT, *PPROC_CONTEXT;
  152. typedef struct _ShareMemoryData{
  153. PFILE_OBJECT pFileObject;
  154. PVOID SystemVirtualAddress;
  155. PVOID UserVirtualAddress;
  156. PMDL Mdl;
  157. LIST_ENTRY Link;
  158. } SHARE_MEMORY_DATA, *PSHARE_MEMORY_DATA;
  159. #endif
  160. PCHAR
  161. PnPMinorFunctionString (
  162.     UCHAR MinorFunction
  163. );
  164. NTSTATUS
  165. AddDevice(
  166.     IN PDRIVER_OBJECT DriverObject,
  167.     IN PDEVICE_OBJECT PhysicalDeviceObject
  168.     );
  169. NTSTATUS
  170. SamplePnpDispatch (
  171.     IN PDEVICE_OBJECT DeviceObject,
  172.     IN PIRP Irp
  173.     );
  174. NTSTATUS
  175. SamplePowerDispatch(
  176.     IN PDEVICE_OBJECT    DeviceObject,
  177.     IN PIRP              Irp
  178.     );
  179. VOID
  180. Unload(
  181.     IN PDRIVER_OBJECT DriverObject
  182.     );
  183. NTSTATUS DefaultPnpHandler(
  184. IN PDEVICE_OBJECT DeviceObject,
  185. IN PIRP Irp
  186. );
  187. NTSTATUS PnpStartDevice(
  188. IN PDEVICE_OBJECT DeviceObject,
  189. IN PIRP Irp
  190. );
  191. NTSTATUS PnpRemoveDevice(
  192. IN PDEVICE_OBJECT DeviceObject,
  193. IN PIRP Irp
  194. );
  195. NTSTATUS ForwardAndWait(
  196. IN PDEVICE_OBJECT DeviceObject,
  197. IN PIRP Irp
  198. );
  199. NTSTATUS SampleCreate (
  200. IN PDEVICE_OBJECT DeviceObject,
  201. IN PIRP Irp
  202. );
  203. NTSTATUS SampleClose(
  204. IN PDEVICE_OBJECT DeviceObject,
  205. IN PIRP Irp
  206. );
  207. NTSTATUS SampleIoControl(
  208. IN PDEVICE_OBJECT DeviceObject,
  209. IN PIRP Irp
  210. );
  211. NTSTATUS SampleCleanup(
  212. IN PDEVICE_OBJECT DeviceObject,
  213. IN PIRP Irp
  214. );
  215. NTSTATUS PnpSurpriseRemoval(
  216.     IN PDEVICE_OBJECT DeviceObject,
  217.     IN PIRP           Irp
  218.     );
  219. NTSTATUS CompleteRequest ( 
  220. IN PIRP Irp,
  221. IN NTSTATUS status,
  222. IN ULONG info
  223. );
  224. NTSTATUS OnRequestComplete(
  225. IN PDEVICE_OBJECT DeviceObject,
  226. IN PIRP Irp,
  227.     IN PKEVENT event
  228. );
  229. NTSTATUS
  230. SampleWrite(
  231.     IN PDEVICE_OBJECT DeviceObject,
  232.     IN PIRP Irp
  233. );
  234. NTSTATUS
  235. SampleRead(
  236.     IN PDEVICE_OBJECT DeviceObject,
  237.     IN PIRP Irp
  238. );
  239. VOID SampleCancelRoutine(
  240.     IN PDEVICE_OBJECT DeviceObject,
  241.     IN PIRP Irp
  242.     );
  243. NTSTATUS SampleCompletionRoutine(
  244.     IN PDEVICE_OBJECT DeviceObject,
  245.     IN PIRP Irp,
  246.     IN PVOID Context
  247.     );
  248. NTSTATUS
  249. ToasterSystemControl (
  250.     IN  PDEVICE_OBJECT  DeviceObject,
  251.     IN  PIRP            Irp
  252.     );
  253. NTSTATUS
  254. PnpQueryStopDevice(
  255.     IN PDEVICE_OBJECT DeviceObject,
  256.     IN PIRP           Irp
  257.     );
  258. NTSTATUS
  259. PnpCancelStopDevice(
  260.     IN PDEVICE_OBJECT DeviceObject,
  261.     IN PIRP           Irp
  262.     );
  263. NTSTATUS
  264. PnpQueryRemoveDevice(
  265.     IN PDEVICE_OBJECT DeviceObject,
  266.     IN PIRP           Irp
  267.     );
  268. NTSTATUS
  269. PnpCancelRemoveDevice(
  270.     IN PDEVICE_OBJECT DeviceObject,
  271.     IN PIRP           Irp
  272.     );
  273. NTSTATUS PnpQueryCapabilities(
  274. IN PDEVICE_OBJECT DeviceObject,
  275. IN PIRP Irp
  276. );
  277. LONG SampleIoIncrement(
  278.     IN OUT PDEVICE_EXTENSION DeviceExtension
  279.     );
  280. LONG SampleIoDecrement(
  281.     IN OUT PDEVICE_EXTENSION DeviceExtension
  282.     );
  283. BOOLEAN InitializeSerialDevName(
  284. PUNICODE_STRING lpDeviceName
  285. );
  286. NTSTATUS
  287. SerialDoExternalNaming(
  288. IN PDEVICE_EXTENSION deviceExtension,
  289. IN LONG ComX
  290. );
  291. NTSTATUS
  292. SerialRemoveDevObj(
  293. IN PDEVICE_OBJECT PDevObj
  294. );
  295. NTSTATUS
  296. SerialUndoExternalNaming(
  297. IN PDEVICE_EXTENSION deviceExtension
  298. );
  299. NTSTATUS CreateDosName( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  300. VOID
  301. ReadDpcRoutine(
  302.     IN PKDPC Dpc,
  303.     IN PVOID DeferredContext,
  304.     IN PVOID SystemArgument1,
  305.     IN PVOID SystemArgument2
  306.     );
  307. ULONG CopyFromRingBuffer(
  308. PDEVICE_EXTENSION deviceExtension,
  309. PIRP Irp );
  310. //  CancelIrp 
  311. VOID CsampInsertIrp (
  312.     IN PIO_CSQ   Csq,
  313.     IN PIRP              Irp
  314.     );
  315. VOID CsampRemoveIrp(
  316.     IN  PIO_CSQ Csq,
  317.     IN  PIRP    Irp
  318.     );
  319. PIRP CsampPeekNextIrp(
  320.     IN  PIO_CSQ Csq,
  321.     IN  PIRP    Irp,
  322.     IN  PVOID   PeekContext
  323.     );
  324. VOID CsampAcquireLock(
  325.     IN  PIO_CSQ Csq,
  326.     OUT PKIRQL  Irql
  327.     );
  328. VOID CsampReleaseLock(
  329.     IN PIO_CSQ Csq,
  330.     IN KIRQL   Irql
  331.     );
  332. VOID CsampCompleteCanceledIrp(
  333.     IN  PIO_CSQ             pCsq,
  334.     IN  PIRP                Irp
  335.     );
  336. // TDI
  337. NTSTATUS Disconnection ( PDEVICE_EXTENSION deviceExtension );
  338. NTSTATUS InitializeConnection( PDEVICE_EXTENSION deviceExtension );
  339. NTSTATUS TDIQueryNetworkInformation( PDEVICE_OBJECT DeviceObject, PIRP Irp );
  340. NTSTATUS TDIRecvDatagram ( PDEVICE_EXTENSION deviceExtension );
  341. NTSTATUS TDISendDatagram( DeviceObject, Irp );
  342. NTSTATUS
  343. DriverEntry(
  344.     IN PDRIVER_OBJECT  DriverObject,
  345.     IN PUNICODE_STRING RegistryPath
  346.     );
  347. #endif