PDC.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1992-1997 Microsoft Corporation
  3. Module Name:
  4.     pdc.h
  5. Abstract:
  6.     This is the main source file for the Windows/NT PDC API demonstration
  7.     program.  This include file defines macros, data structures and procedure
  8.     prototypes for the code contained in the PDC.C source file.
  9. --*/
  10. //
  11. // Include file for using the Win32 API
  12. //
  13. #include <windows.h>
  14. //
  15. // C Runtime include files used by the program.
  16. //
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <errno.h>
  20. #include <ctype.h>
  21. #include <string.h>
  22. #include <io.h>
  23. #include <fcntl.h>
  24. #include <malloc.h>
  25. #include <systypes.h>
  26. #include <sysstat.h>
  27. //
  28. // Macro definitions
  29. //
  30. //
  31. // Useful rounding macros that the rounding amount is always a
  32. // power of two.
  33. //
  34. #define ROUND_DOWN( Size, Amount ) ((DWORD)(Size) & ~((Amount) - 1))
  35. #define ROUND_UP( Size, Amount ) (((DWORD)(Size) + ((Amount) - 1)) & ~((Amount) - 1))
  36. //
  37. // Pseudo keywords for documentation purposes.
  38. //
  39. #define IN
  40. #define OUT
  41. #define OPTIONAL
  42. //
  43. // Determine if an argument is present by testing a value of NULL
  44. //
  45. #define ARGUMENT_PRESENT( ArgumentPointer )    (
  46.     (LPSTR)(ArgumentPointer) != (LPSTR)(NULL) )
  47. //
  48. // Calculate the address of the base of the structure given its type, and an
  49. // address of a field within the structure.
  50. //
  51. #define CONTAINING_RECORD( address, type, field ) ((type *)( 
  52.                                                    (PCHAR)(address) - 
  53.                                                    (PCHAR)(&((type *)0)->field)))
  54. //
  55. // Virtual Buffer data structure and function prototypes.
  56. //
  57. typedef struct _VIRTUAL_BUFFER {
  58.     LPVOID Base;
  59.     ULONG PageSize;
  60.     LPVOID CommitLimit;
  61.     LPVOID ReserveLimit;
  62. } VIRTUAL_BUFFER, *PVIRTUAL_BUFFER;
  63. BOOL
  64. CreateVirtualBuffer(
  65.     OUT PVIRTUAL_BUFFER Buffer,
  66.     IN DWORD CommitSize,
  67.     IN DWORD ReserveSize OPTIONAL
  68.     );
  69. BOOL
  70. ExtendVirtualBuffer(
  71.     IN PVIRTUAL_BUFFER Buffer,
  72.     IN LPVOID Address
  73.     );
  74. BOOL
  75. TrimVirtualBuffer(
  76.     IN PVIRTUAL_BUFFER Buffer
  77.     );
  78. BOOL
  79. FreeVirtualBuffer(
  80.     IN PVIRTUAL_BUFFER Buffer
  81.     );
  82. int
  83. VirtualBufferExceptionFilter(
  84.     IN DWORD ExceptionCode,
  85.     IN PEXCEPTION_POINTERS ExceptionInfo,
  86.     IN OUT PVIRTUAL_BUFFER Buffer
  87.     );
  88. //
  89. // Directory enumeration and file notification definitions.
  90. //
  91. typedef
  92. VOID (*PDIRECTORY_ENUMERATE_ROUTINE)(
  93.     LPSTR Path,
  94.     PWIN32_FIND_DATA FindFileData,
  95.     PVOID EnumerateParameter
  96.     );
  97. BOOL
  98. EnumerateDirectoryTree(
  99.     LPSTR DirectoryPath,
  100.     PDIRECTORY_ENUMERATE_ROUTINE EnumerateRoutine,
  101.     PVOID EnumerateParameter
  102.     );
  103. //
  104. // Data structures private to the EnumerateDirectoryTree function.
  105. //
  106. typedef struct _ENUMERATE_DIRECTORY_STACK {
  107.     LPSTR PathEnd;
  108.     HANDLE FindHandle;
  109. } ENUMERATE_DIRECTORY_STACK, *PENUMERATE_DIRECTORY_STACK;
  110. #define MAX_DEPTH 256
  111. typedef struct _ENUMERATE_DIRECTORY_STATE {
  112.     DWORD Depth;
  113.     ENUMERATE_DIRECTORY_STACK Stack[ MAX_DEPTH ];
  114.     CHAR Path[ MAX_PATH ];
  115. } ENUMERATE_DIRECTORY_STATE, *PENUMERATE_DIRECTORY_STATE;
  116. //
  117. //  Doubly-linked list manipulation routines.  Implemented as macros
  118. //  but logically these are procedures.
  119. //
  120. //
  121. //  VOID
  122. //  InitializeListHead(
  123. //      PLIST_ENTRY ListHead
  124. //      );
  125. //
  126. #define InitializeListHead(ListHead) (
  127.     (ListHead)->Flink = (ListHead)->Blink = (ListHead) )
  128. //
  129. //  BOOLEAN
  130. //  IsListEmpty(
  131. //      PLIST_ENTRY ListHead
  132. //      );
  133. //
  134. #define IsListEmpty(ListHead) (
  135.     ( ((ListHead)->Flink == (ListHead)) ? TRUE : FALSE ) )
  136. //
  137. //  PLIST_ENTRY
  138. //  RemoveHeadList(
  139. //      PLIST_ENTRY ListHead
  140. //      );
  141. //
  142. #define RemoveHeadList(ListHead) 
  143.     (ListHead)->Flink;
  144.     {
  145.         PLIST_ENTRY FirstEntry;
  146.         FirstEntry = (ListHead)->Flink;
  147.         FirstEntry->Flink->Blink = (ListHead);
  148.         (ListHead)->Flink = FirstEntry->Flink;
  149.     }
  150. //
  151. //  VOID
  152. //  RemoveEntryList(
  153. //      PLIST_ENTRY Entry
  154. //      );
  155. //
  156. #define RemoveEntryList(Entry) {
  157.         PLIST_ENTRY _EX_Entry;
  158.         _EX_Entry = (Entry);
  159.         _EX_Entry->Blink->Flink = _EX_Entry->Flink;
  160.         _EX_Entry->Flink->Blink = _EX_Entry->Blink;
  161.         }
  162. //
  163. //  VOID
  164. //  InsertTailList(
  165. //      PLIST_ENTRY ListHead,
  166. //      PLIST_ENTRY Entry
  167. //      );
  168. //
  169. #define InsertTailList(ListHead,Entry) 
  170.     (Entry)->Flink = (ListHead);
  171.     (Entry)->Blink = (ListHead)->Blink;
  172.     (ListHead)->Blink->Flink = (Entry);
  173.     (ListHead)->Blink = (Entry)
  174. //
  175. //  VOID
  176. //  InsertHeadList(
  177. //      PLIST_ENTRY ListHead,
  178. //      PLIST_ENTRY Entry
  179. //      );
  180. //
  181. #define InsertHeadList(ListHead,Entry) 
  182.     (Entry)->Flink = (ListHead)->Flink;
  183.     (Entry)->Blink = (ListHead);
  184.     (ListHead)->Flink->Blink = (Entry);
  185.     (ListHead)->Flink = (Entry)
  186. //
  187. // Worker thread definitions
  188. //
  189. typedef
  190. VOID
  191. (*PWORKER_ROUTINE)(
  192.   //  IN PWORK_QUEUE_ITEM WorkItem
  193.     );
  194. typedef struct _WORK_QUEUE {
  195.     CRITICAL_SECTION CriticalSection;
  196.     HANDLE Semaphore;
  197.     LIST_ENTRY Queue;
  198.     BOOL Terminating;
  199.     PWORKER_ROUTINE WorkerRoutine;
  200.     DWORD NumberOfWorkerThreads;
  201.     HANDLE WorkerThreads[ 1 ];      // Variable length array
  202. } WORK_QUEUE, *PWORK_QUEUE;
  203. typedef struct _WORK_QUEUE_ITEM {
  204.     LIST_ENTRY List;
  205.     DWORD Reason;
  206.     PWORK_QUEUE WorkQueue;
  207. } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
  208. #define WORK_INITIALIZE_ITEM 0
  209. #define WORK_ITEM            1
  210. #define WORK_TERMINATE_ITEM  2
  211. DWORD
  212. WorkerThread(
  213.     LPVOID lpThreadParameter
  214.     );
  215. PWORK_QUEUE
  216. CreateWorkQueue(
  217.     IN DWORD NumberOfWorkerThreads,
  218.     IN PWORKER_ROUTINE WorkerRoutine
  219.     );
  220. BOOL
  221. QueueWorkItem(
  222.     IN OUT PWORK_QUEUE WorkQueue,
  223.     IN PWORK_QUEUE_ITEM WorkItem
  224.     );
  225. VOID
  226. DestroyWorkQueue(
  227.     IN OUT PWORK_QUEUE WorkQueue
  228.     );
  229. //
  230. // Main procedure prototypes
  231. //
  232. BOOL
  233. ProcessCommandLineArguments(
  234.     int argc,
  235.     char *argv[]
  236.     );
  237. VOID
  238. QueueSearchFile(
  239.     LPSTR Path,
  240.     PWIN32_FIND_DATA FindFileData,
  241.     PVOID EnumerateParameter
  242.     );
  243. typedef struct _SEARCH_REQUEST_STATE {
  244.     VIRTUAL_BUFFER Buffer;
  245.     LPSTR CurrentOutput;
  246. } SEARCH_REQUEST_STATE, *PSEARCH_REQUEST_STATE;
  247. typedef struct _SEARCH_REQUEST {
  248.     WORK_QUEUE_ITEM WorkItem;
  249.     DWORD FileSize;
  250.     LPSTR FileData;
  251.     HANDLE File;
  252.     OVERLAPPED OverlappedIO;
  253.     CHAR FullPathName[ 1 ];         // Variable length array
  254. } SEARCH_REQUEST, *PSEARCH_REQUEST;
  255. VOID
  256. ProcessRequest(
  257.     IN PWORK_QUEUE_ITEM WorkItem
  258.     );
  259. VOID
  260. ProcessReadFileCompletion(
  261.     DWORD dwErrorCode,
  262.     DWORD dwNumberOfBytesTransfered,
  263.     LPOVERLAPPED lpOverlapped
  264.     );
  265. VOID
  266. ProcessSearchFile(
  267.     IN PSEARCH_REQUEST WorkerRequest,
  268.     IN PSEARCH_REQUEST_STATE State
  269.     );
  270. //
  271. // Global variables
  272. //
  273. DWORD TlsIndex;
  274. INT NumberOfWorkerThreads;
  275. BOOL Verbose;
  276. BOOL IgnoreCase;
  277. BOOL MappedFileIO;
  278. BOOL ASyncIO;
  279. BOOL SyncIO;
  280. LPSTR DirectoryPath;
  281. LPSTR SearchString;
  282. DWORD SearchStringLength;
  283. DWORD SearchedFileCount;
  284. DWORD MatchedFileCount;
  285. DWORD MatchedLineCount;
  286. LONG  OutstandingIOOperations;
  287. HANDLE IoCompletedEvent;
  288. typedef
  289. int
  290. (_CRTAPI1 *PCOMPARE_ROUTINE)(
  291.     IN const char *,
  292.     IN const char *,
  293.     IN size_t
  294.     );
  295. PCOMPARE_ROUTINE SearchFunction;