Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

374 lines
8.8 KiB

  1. /*++
  2. Copyright (c) 1999 Microsoft Corporation
  3. Module Name:
  4. fileenum.h
  5. Abstract:
  6. Set of APIs to enumerate a file system using Win32 APIs.
  7. Author:
  8. 20-Oct-1999 Ovidiu Temereanca (ovidiut) - File creation.
  9. Revision History:
  10. <alias> <date> <comments>
  11. --*/
  12. //
  13. // Types
  14. //
  15. //
  16. // Drive enumeration structures
  17. //
  18. #define DRIVEENUM_UNKNOWN DRIVE_UNKNOWN
  19. #define DRIVEENUM_NOROOTDIR DRIVE_NO_ROOT_DIR
  20. #define DRIVEENUM_REMOVABLE DRIVE_REMOVABLE
  21. #define DRIVEENUM_FIXED DRIVE_FIXED
  22. #define DRIVEENUM_REMOTE DRIVE_REMOTE
  23. #define DRIVEENUM_CDROM DRIVE_CDROM
  24. #define DRIVEENUM_RAMDISK DRIVE_RAMDISK
  25. #define DRIVEENUM_NONE 0
  26. #define DRIVEENUM_ALL (DRIVE_UNKNOWN|DRIVE_NO_ROOT_DIR|DRIVE_REMOVABLE|DRIVE_FIXED|DRIVE_REMOTE|DRIVE_CDROM|DRIVE_RAMDISK)
  27. #define DRIVEENUM_ALLVALID (DRIVE_REMOVABLE|DRIVE_FIXED|DRIVE_REMOTE|DRIVE_CDROM|DRIVE_RAMDISK)
  28. typedef struct {
  29. PCSTR DriveName;
  30. UINT DriveType;
  31. //
  32. // private members, maintained by enumeration
  33. //
  34. PSTR AllLogicalDrives;
  35. UINT WantedDriveTypes;
  36. } DRIVE_ENUMA, *PDRIVE_ENUMA;
  37. typedef struct {
  38. PCWSTR DriveName;
  39. UINT DriveType;
  40. //
  41. // private members, maintained by enumeration
  42. //
  43. PWSTR AllLogicalDrives;
  44. UINT WantedDriveTypes;
  45. } DRIVE_ENUMW, *PDRIVE_ENUMW;
  46. //
  47. // File enumeration structures
  48. //
  49. #define FILEENUM_ALL_SUBLEVELS 0xFFFFFFFF
  50. typedef enum {
  51. FECF_SKIPDIR = 0x0001,
  52. FECF_SKIPSUBDIRS = 0x0002,
  53. FECF_SKIPFILES = 0x0004,
  54. } FILEENUM_CONTROLFLAGS;
  55. typedef enum {
  56. FEIF_RETURN_DIRS = 0x0001,
  57. FEIF_FILES_FIRST = 0x0002,
  58. FEIF_DEPTH_FIRST = 0x0004,
  59. FEIF_USE_EXCLUSIONS = 0x0008,
  60. FEIF_CONTAINERS_FIRST = 0x0010,
  61. } FILEENUM_INFOFLAGS;
  62. typedef enum {
  63. DNS_ENUM_INIT,
  64. DNS_FILE_FIRST,
  65. DNS_FILE_NEXT,
  66. DNS_FILE_DONE,
  67. DNS_SUBDIR_FIRST,
  68. DNS_SUBDIR_NEXT,
  69. DNS_SUBDIR_DONE,
  70. DNS_ENUM_DONE
  71. } DNS_ENUM_STATE;
  72. typedef enum {
  73. FES_ROOT_FIRST,
  74. FES_ROOT_NEXT,
  75. FES_ROOT_DONE
  76. } FES_ROOT_STATE;
  77. typedef enum {
  78. DNF_RETURN_DIRNAME = 0x0001,
  79. DNF_DIRNAME_MATCHES = 0x0002,
  80. } DIRNODE_FLAGS;
  81. typedef struct {
  82. PCSTR DirName;
  83. DWORD DirAttributes;
  84. PSTR FileName;
  85. HANDLE FindHandle;
  86. WIN32_FIND_DATAA FindData;
  87. DWORD EnumState;
  88. DWORD Flags;
  89. DWORD SubLevel;
  90. } DIRNODEA, *PDIRNODEA;
  91. typedef struct {
  92. PCWSTR DirName;
  93. DWORD DirAttributes;
  94. PWSTR FileName;
  95. HANDLE FindHandle;
  96. WIN32_FIND_DATAW FindData;
  97. DWORD EnumState;
  98. DWORD Flags;
  99. DWORD SubLevel;
  100. } DIRNODEW, *PDIRNODEW;
  101. typedef BOOL (*FPE_ERROR_CALLBACKA)(PDIRNODEA);
  102. typedef struct {
  103. POBSPARSEDPATTERNA PathPattern;
  104. DWORD Flags;
  105. DWORD RootLevel;
  106. DWORD MaxSubLevel;
  107. FPE_ERROR_CALLBACKA CallbackOnError;
  108. } FILEENUMINFOA, *PFILEENUMINFOA;
  109. typedef BOOL (*FPE_ERROR_CALLBACKW)(PDIRNODEW);
  110. typedef struct {
  111. POBSPARSEDPATTERNW PathPattern;
  112. DWORD Flags;
  113. DWORD RootLevel;
  114. DWORD MaxSubLevel;
  115. FPE_ERROR_CALLBACKW CallbackOnError;
  116. } FILEENUMINFOW, *PFILEENUMINFOW;
  117. typedef struct {
  118. PCSTR EncodedFullName;
  119. PCSTR Name;
  120. PCSTR Location;
  121. CHAR NativeFullName[MAX_MBCHAR_PATH];
  122. DWORD Attributes;
  123. DWORD CurrentLevel;
  124. //
  125. // Private members
  126. //
  127. DWORD ControlFlags;
  128. FILEENUMINFOA FileEnumInfo;
  129. GROWBUFFER FileNodes;
  130. DWORD RootState;
  131. PDRIVE_ENUMA DriveEnum;
  132. UINT DriveEnumTypes;
  133. PDIRNODEA LastNode;
  134. PSTR FileNameAppendPos;
  135. PSTR LastWackPtr;
  136. } FILETREE_ENUMA, *PFILETREE_ENUMA;
  137. typedef struct {
  138. PCWSTR EncodedFullName;
  139. PCWSTR Name;
  140. PCWSTR Location;
  141. WCHAR NativeFullName[MAX_WCHAR_PATH];
  142. DWORD Attributes;
  143. DWORD CurrentLevel;
  144. //
  145. // Private members
  146. //
  147. DWORD ControlFlags;
  148. FILEENUMINFOW FileEnumInfo;
  149. GROWBUFFER FileNodes;
  150. DWORD RootState;
  151. PDRIVE_ENUMW DriveEnum;
  152. UINT DriveEnumTypes;
  153. PDIRNODEW LastNode;
  154. PWSTR FileNameAppendPos;
  155. PWSTR LastWackPtr;
  156. } FILETREE_ENUMW, *PFILETREE_ENUMW;
  157. //
  158. // API
  159. //
  160. BOOL
  161. FileEnumInitialize (
  162. VOID
  163. );
  164. VOID
  165. FileEnumTerminate (
  166. VOID
  167. );
  168. //
  169. // File enumeration APIs
  170. //
  171. BOOL
  172. EnumFirstFileInTreeExA (
  173. OUT PFILETREE_ENUMA FileEnum,
  174. IN PCSTR EncodedPathPattern,
  175. IN UINT DriveEnumTypes,
  176. IN BOOL EnumContainers,
  177. IN BOOL ContainersFirst,
  178. IN BOOL FilesFirst,
  179. IN BOOL DepthFirst,
  180. IN DWORD MaxSubLevels,
  181. IN BOOL UseExclusions,
  182. IN FPE_ERROR_CALLBACKA CallbackOnError OPTIONAL
  183. );
  184. #define EnumFirstFileInTreeA(e,p) EnumFirstFileInTreeExA(e,p,DRIVEENUM_ALLVALID,TRUE,TRUE,TRUE,TRUE,FILEENUM_ALL_SUBLEVELS,FALSE,NULL)
  185. BOOL
  186. EnumFirstFileInTreeExW (
  187. OUT PFILETREE_ENUMW FileEnum,
  188. IN PCWSTR EncodedPathPattern,
  189. IN UINT DriveEnumTypes,
  190. IN BOOL EnumContainers,
  191. IN BOOL ContainersFirst,
  192. IN BOOL FilesFirst,
  193. IN BOOL DepthFirst,
  194. IN DWORD MaxSubLevels,
  195. IN BOOL UseExclusions,
  196. IN FPE_ERROR_CALLBACKW CallbackOnError OPTIONAL
  197. );
  198. #define EnumFirstFileInTreeW(e,p) EnumFirstFileInTreeExW(e,p,DRIVEENUM_ALLVALID,TRUE,TRUE,TRUE,TRUE,FILEENUM_ALL_SUBLEVELS,FALSE,NULL)
  199. BOOL
  200. EnumNextFileInTreeA (
  201. IN OUT PFILETREE_ENUMA FileEnum
  202. );
  203. BOOL
  204. EnumNextFileInTreeW (
  205. IN OUT PFILETREE_ENUMW FileEnum
  206. );
  207. VOID
  208. AbortEnumFileInTreeA (
  209. IN OUT PFILETREE_ENUMA FileEnum
  210. );
  211. VOID
  212. AbortEnumFileInTreeW (
  213. IN OUT PFILETREE_ENUMW FileEnum
  214. );
  215. //
  216. // Drive enumeration APIs
  217. //
  218. BOOL
  219. EnumFirstDriveA (
  220. OUT PDRIVE_ENUMA DriveEnum,
  221. IN UINT WantedDriveTypes
  222. );
  223. BOOL
  224. EnumFirstDriveW (
  225. OUT PDRIVE_ENUMW DriveEnum,
  226. IN UINT WantedDriveTypes
  227. );
  228. BOOL
  229. EnumNextDriveA (
  230. IN OUT PDRIVE_ENUMA DriveEnum
  231. );
  232. BOOL
  233. EnumNextDriveW (
  234. IN OUT PDRIVE_ENUMW DriveEnum
  235. );
  236. VOID
  237. AbortEnumDriveA (
  238. IN OUT PDRIVE_ENUMA DriveEnum
  239. );
  240. VOID
  241. AbortEnumDriveW (
  242. IN OUT PDRIVE_ENUMW DriveEnum
  243. );
  244. //
  245. // Routines built on enum
  246. //
  247. BOOL
  248. FiRemoveAllFilesInDirA (
  249. IN PCSTR Dir
  250. );
  251. BOOL
  252. FiRemoveAllFilesInDirW (
  253. IN PCWSTR Dir
  254. );
  255. BOOL
  256. FiRemoveAllFilesInTreeA (
  257. IN PCSTR Dir
  258. );
  259. BOOL
  260. FiRemoveAllFilesInTreeW (
  261. IN PCWSTR Dir
  262. );
  263. //
  264. // Macros
  265. //
  266. #ifdef UNICODE
  267. #define DIRNODE DIRNODEW
  268. #define PDIRNODE PDIRNODEW
  269. #define FILENODE FILENODEW
  270. #define PFILENODE PFILENODEW
  271. #define RPE_ERROR_CALLBACK RPE_ERROR_CALLBACKW
  272. #define FILEENUMINFO FILEENUMINFOW
  273. #define PFILEENUMINFO PFILEENUMINFOW
  274. #define FILETREE_ENUM FILETREE_ENUMW
  275. #define PFILETREE_ENUM PFILETREE_ENUMW
  276. #define EnumFirstFileInTree EnumFirstFileInTreeW
  277. #define EnumFirstFileInTreeEx EnumFirstFileInTreeExW
  278. #define EnumNextFileInTree EnumNextFileInTreeW
  279. #define AbortEnumFileInTree AbortEnumFileInTreeW
  280. #define DRIVE_ENUM DRIVE_ENUMW
  281. #define EnumFirstDrive EnumFirstDriveW
  282. #define EnumNextDrive EnumNextDriveW
  283. #define AbortEnumDrive AbortEnumDriveW
  284. #define FiRemoveAllFilesInDir FiRemoveAllFilesInDirW
  285. #define FiRemoveAllFilesInTree FiRemoveAllFilesInTreeW
  286. #else
  287. #define DIRNODE DIRNODEA
  288. #define PDIRNODE PDIRNODEA
  289. #define FILENODE FILENODEA
  290. #define PFILENODE PFILENODEA
  291. #define RPE_ERROR_CALLBACK RPE_ERROR_CALLBACKA
  292. #define FILEENUMINFO FILEENUMINFOA
  293. #define PFILEENUMINFO PFILEENUMINFOA
  294. #define FILETREE_ENUM FILETREE_ENUMA
  295. #define PFILETREE_ENUM PFILETREE_ENUMA
  296. #define EnumFirstFileInTree EnumFirstFileInTreeA
  297. #define EnumFirstFileInTreeEx EnumFirstFileInTreeExA
  298. #define EnumNextFileInTree EnumNextFileInTreeA
  299. #define AbortEnumFileInTree AbortEnumFileInTreeA
  300. #define DRIVE_ENUM DRIVE_ENUMA
  301. #define EnumFirstDrive EnumFirstDriveA
  302. #define EnumNextDrive EnumNextDriveA
  303. #define AbortEnumDrive AbortEnumDriveA
  304. #define FiRemoveAllFilesInDir FiRemoveAllFilesInDirA
  305. #define FiRemoveAllFilesInTree FiRemoveAllFilesInTreeA
  306. #endif