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