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.

708 lines
17 KiB

  1. /*++
  2. Copyright (c) 1998 Microsoft Corporation
  3. Module Name:
  4. migutil.h
  5. Abstract:
  6. Includes all header files necessary to use the lib generated by
  7. common\migutil. Declares a bunch of utility functions and macros.
  8. Declares project-wide MAX constants.
  9. Author:
  10. Jim Schmidt (jimschm) 23-Aug-1996
  11. Revision History:
  12. Many changes, see SLM log for details.
  13. --*/
  14. #pragma once
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. //
  19. // MAX constants
  20. //
  21. #define MAX_PATH_PLUS_NUL (MAX_PATH+1)
  22. #define MAX_MBCHAR_PATH (MAX_PATH_PLUS_NUL*2)
  23. #define MAX_WCHAR_PATH MAX_PATH_PLUS_NUL
  24. #define MAX_MBCHAR_PRINTABLE_PATH (MAX_PATH*2)
  25. #define MAX_WCHAR_PRINTABLE_PATH MAX_PATH
  26. #define MAX_SERVER_NAMEA (64*2)
  27. #define MAX_USER_NAMEA (MAX_PATH)
  28. #define MAX_REGISTRY_KEYA (1024 * 2)
  29. #define MAX_REGISTRY_VALUE_NAMEA (260 * 2)
  30. #define MAX_COMPONENT_NAMEA (256 * 2)
  31. #define MAX_COMPUTER_NAMEA (64 * 2)
  32. #define MAX_CMDLINEA (1024 * 2) // maximum number of chars in a Win95 command line
  33. #define MAX_TRANSLATION 32
  34. #define MAX_KEYBOARDLAYOUT 64
  35. #define MAX_INF_SECTION_NAME 128
  36. #define MAX_INF_KEY_NAME 128
  37. #define MAX_SERVER_NAMEW 64
  38. #define MAX_USER_NAMEW (MAX_PATH)
  39. #define MAX_REGISTRY_KEYW 1024
  40. #define MAX_REGISTRY_VALUE_NAMEW 260
  41. #define MAX_COMPONENT_NAMEW 256
  42. #define MAX_COMPUTER_NAMEW 64
  43. #define MAX_CMDLINEW 1024 // maximum number of chars in a Win95 command line
  44. #ifdef UNICODE
  45. #define MAX_SERVER_NAME MAX_SERVER_NAMEW
  46. #define MAX_USER_NAME MAX_USER_NAMEW
  47. #define MAX_REGISTRY_KEY MAX_REGISTRY_KEYW
  48. #define MAX_REGISTRY_VALUE_NAME MAX_REGISTRY_VALUE_NAMEW
  49. #define MAX_COMPONENT_NAME MAX_COMPONENT_NAMEW
  50. #define MAX_COMPUTER_NAME MAX_COMPUTER_NAMEW
  51. #define MAX_CMDLINE MAX_CMDLINEW
  52. #define MAX_TCHAR_PATH MAX_WCHAR_PATH
  53. #define MAX_TCHAR_PRINTABLE_PATH MAX_WCHAR_PRINTABLE_PATH
  54. #else
  55. #define MAX_SERVER_NAME MAX_SERVER_NAMEA
  56. #define MAX_USER_NAME MAX_USER_NAMEA
  57. #define MAX_REGISTRY_KEY MAX_REGISTRY_KEYA
  58. #define MAX_REGISTRY_VALUE_NAME MAX_REGISTRY_VALUE_NAMEA
  59. #define MAX_COMPONENT_NAME MAX_COMPONENT_NAMEA
  60. #define MAX_COMPUTER_NAME MAX_COMPUTER_NAMEA
  61. #define MAX_CMDLINE MAX_CMDLINEA
  62. #define MAX_TCHAR_PATH MAX_MBCHAR_PATH
  63. #define MAX_TCHAR_PRINTABLE_PATH MAX_MBCHAR_PRINTABLE_PATH
  64. #endif
  65. //
  66. // Critical Section APIs, implemented because TryEnterCriticalSection is
  67. // supported only on NT, and we need it on Win9x.
  68. //
  69. typedef struct {
  70. HANDLE EventHandle;
  71. } OUR_CRITICAL_SECTION, *POUR_CRITICAL_SECTION;
  72. BOOL
  73. InitializeOurCriticalSection (
  74. OUR_CRITICAL_SECTION *pcs
  75. );
  76. VOID
  77. DeleteOurCriticalSection (
  78. OUR_CRITICAL_SECTION *pcs
  79. );
  80. BOOL
  81. EnterOurCriticalSection (
  82. OUR_CRITICAL_SECTION *pcs
  83. );
  84. VOID
  85. LeaveOurCriticalSection (
  86. OUR_CRITICAL_SECTION *pcs
  87. );
  88. BOOL
  89. TryEnterOurCriticalSection (
  90. OUR_CRITICAL_SECTION *pcs
  91. );
  92. PSTR
  93. UnicodeToCcs (
  94. PCWSTR Source
  95. );
  96. //
  97. // Fail-proof memory allocators
  98. //
  99. PVOID
  100. SafeHeapAlloc (
  101. HANDLE g_hHeap,
  102. DWORD Flags,
  103. DWORD Size
  104. );
  105. PVOID
  106. SafeHeapReAlloc (
  107. HANDLE g_hHeap,
  108. DWORD Flags,
  109. PVOID OldBlock,
  110. DWORD Size
  111. );
  112. //
  113. // Includes of util modules
  114. //
  115. #include "chartype.h"
  116. #include "debug.h"
  117. #include "log.h"
  118. #include "staticsz.h"
  119. #include "growbuf.h" // must appear before strings.h and file.h
  120. #include "strings.h"
  121. #include "poolmem.h"
  122. #include "growlist.h"
  123. #include "file.h"
  124. #include "reg.h"
  125. #include "ipc.h"
  126. #include "fileenum.h"
  127. #include "inf.h"
  128. #include "unicode.h"
  129. #include "expandit.h"
  130. #include "hash.h"
  131. #include "uninstall.h"
  132. #include "persist.h"
  133. extern HINSTANCE g_hInst;
  134. extern HANDLE g_hHeap;
  135. extern OSVERSIONINFOA g_OsInfo;
  136. VOID
  137. CenterWindow (
  138. HWND Wnd,
  139. HWND Parent OPTIONAL
  140. );
  141. VOID
  142. TurnOnWaitCursor (
  143. VOID
  144. );
  145. VOID
  146. TurnOffWaitCursor (
  147. VOID
  148. );
  149. //
  150. // Version APIs
  151. //
  152. typedef struct {
  153. WORD CodePage;
  154. WORD Language;
  155. } TRANSLATION, *PTRANSLATION;
  156. typedef struct {
  157. GROWBUFFER GrowBuf;
  158. PBYTE VersionBuffer;
  159. PTRANSLATION Translations;
  160. PBYTE StringBuffer;
  161. UINT Size;
  162. DWORD Handle;
  163. VS_FIXEDFILEINFO *FixedInfo;
  164. UINT FixedInfoSize;
  165. CHAR TranslationStr[MAX_TRANSLATION];
  166. UINT MaxTranslations;
  167. UINT CurrentTranslation;
  168. UINT CurrentDefaultTranslation;
  169. PCSTR FileSpec;
  170. PCSTR VersionField;
  171. } VERSION_STRUCTA, *PVERSION_STRUCTA;
  172. typedef struct {
  173. GROWBUFFER GrowBuf;
  174. PBYTE VersionBuffer;
  175. PTRANSLATION Translations;
  176. PBYTE StringBuffer;
  177. UINT Size;
  178. DWORD Handle;
  179. VS_FIXEDFILEINFO *FixedInfo;
  180. UINT FixedInfoSize;
  181. WCHAR TranslationStr[MAX_TRANSLATION];
  182. UINT MaxTranslations;
  183. UINT CurrentTranslation;
  184. UINT CurrentDefaultTranslation;
  185. PCWSTR FileSpec;
  186. PCWSTR VersionField;
  187. } VERSION_STRUCTW, *PVERSION_STRUCTW;
  188. BOOL
  189. CreateVersionStructA (
  190. OUT PVERSION_STRUCTA VersionStruct,
  191. IN PCSTR FileSpec
  192. );
  193. VOID
  194. DestroyVersionStructA (
  195. IN PVERSION_STRUCTA VersionStruct
  196. );
  197. PCSTR
  198. EnumFirstVersionTranslationA (
  199. IN OUT PVERSION_STRUCTA VersionStruct
  200. );
  201. PCSTR
  202. EnumNextVersionTranslationA (
  203. IN OUT PVERSION_STRUCTA VersionStruct
  204. );
  205. PCSTR
  206. EnumFirstVersionValueA (
  207. IN OUT PVERSION_STRUCTA VersionStruct,
  208. IN PCSTR VersionField
  209. );
  210. PCSTR
  211. EnumNextVersionValueA (
  212. IN OUT PVERSION_STRUCTA VersionStruct
  213. );
  214. BOOL
  215. CreateVersionStructW (
  216. OUT PVERSION_STRUCTW VersionStruct,
  217. IN PCWSTR FileSpec
  218. );
  219. VOID
  220. DestroyVersionStructW (
  221. IN PVERSION_STRUCTW VersionStruct
  222. );
  223. PCWSTR
  224. EnumFirstVersionTranslationW (
  225. IN OUT PVERSION_STRUCTW VersionStruct
  226. );
  227. PCWSTR
  228. EnumNextVersionTranslationW (
  229. IN OUT PVERSION_STRUCTW VersionStruct
  230. );
  231. PCWSTR
  232. EnumFirstVersionValueW (
  233. IN OUT PVERSION_STRUCTW VersionStruct,
  234. IN PCWSTR VersionField
  235. );
  236. PCWSTR
  237. EnumNextVersionValueW (
  238. IN OUT PVERSION_STRUCTW VersionStruct
  239. );
  240. ULONGLONG
  241. VerGetFileVer (
  242. IN PVERSION_STRUCTA VersionStruct
  243. );
  244. ULONGLONG
  245. VerGetProductVer (
  246. IN PVERSION_STRUCTA VersionStruct
  247. );
  248. DWORD
  249. VerGetFileDateLo (
  250. IN PVERSION_STRUCTA VersionStruct
  251. );
  252. DWORD
  253. VerGetFileDateHi (
  254. IN PVERSION_STRUCTA VersionStruct
  255. );
  256. DWORD
  257. VerGetFileVerOs (
  258. IN PVERSION_STRUCTA VersionStruct
  259. );
  260. DWORD
  261. VerGetFileVerType (
  262. IN PVERSION_STRUCTA VersionStruct
  263. );
  264. //
  265. // Reusable memory alloc, kind of like a GROWBUFFER but more simple
  266. //
  267. PVOID
  268. ReuseAlloc (
  269. HANDLE Heap,
  270. PVOID OldPtr,
  271. DWORD SizeNeeded
  272. );
  273. VOID
  274. ReuseFree (
  275. HANDLE Heap,
  276. PVOID Ptr
  277. );
  278. VOID
  279. OutOfMemory_Terminate (
  280. VOID
  281. );
  282. VOID
  283. SetOutOfMemoryParent (
  284. HWND hwnd
  285. );
  286. //
  287. // Error condition tags.
  288. //
  289. // These tags should be used for all error conditions.
  290. //
  291. #define ERROR_CRITICAL
  292. #define ERROR_NONCRITICAL
  293. #define ERROR_TRIVIAL
  294. #define ERROR_ABNORMAL_CONDITION
  295. //
  296. // OSVERSION macros...
  297. //
  298. #define BUILDNUMBER() (LOWORD(g_OsInfo.dwBuildNumber))
  299. #define ISNT() (g_OsInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
  300. #define ISWIN9X() (g_OsInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
  301. #define ISWIN95_GOLDEN() (ISWIN95() && BUILDNUMBER() <= 1000)
  302. #define ISWIN95_OSR2() (ISWIN95() && BUILDNUMBER() > 1000)
  303. #define ISWIN95() (ISWIN9X() && !ISATLEASTWIN98())
  304. #define ISMEMPHIS() (ISWIN9X() && g_OsInfo.dwMajorVersion==4 && g_OsInfo.dwMinorVersion==10)
  305. #define ISMILLENNIUM() (ISWIN9X() && g_OsInfo.dwMajorVersion==4 && g_OsInfo.dwMinorVersion==90)
  306. #define ISATLEASTOSR2() (ISWIN9X() && g_OsInfo.dwMajorVersion>=4 && BUILDNUMBER()>1000)
  307. #define ISATLEASTWIN98() (ISWIN9X() && g_OsInfo.dwMajorVersion>=4 && g_OsInfo.dwMinorVersion>=10)
  308. //
  309. // Platform macros...
  310. //
  311. extern BOOL g_IsPc98;
  312. #define ISPC98() (g_IsPc98)
  313. //
  314. // Boot drive letter
  315. //
  316. extern PCSTR g_BootDrivePathA;
  317. extern PCWSTR g_BootDrivePathW;
  318. extern PCSTR g_BootDriveA;
  319. extern PCWSTR g_BootDriveW;
  320. extern CHAR g_BootDriveLetterA;
  321. extern WCHAR g_BootDriveLetterW;
  322. //
  323. // String Mapping
  324. //
  325. #define STRMAP_ANY_MATCH 0
  326. #define STRMAP_COMPLETE_MATCH_ONLY 0x0001
  327. #define STRMAP_FIRST_CHAR_MUST_MATCH 0x0002
  328. #define STRMAP_RETURN_AFTER_FIRST_REPLACE 0x0004
  329. #define STRMAP_REQUIRE_WACK_OR_NUL 0x0008
  330. typedef struct {
  331. BOOL UnicodeData;
  332. //
  333. // The filter can replace NewSubString. (The filter must also
  334. // set NewSubStringSizeInBytes when replacing NewSubString.)
  335. //
  336. union {
  337. struct {
  338. PCWSTR OriginalString;
  339. PCWSTR BeginningOfMatch;
  340. PCWSTR CurrentString;
  341. PCWSTR OldSubString;
  342. PCWSTR NewSubString;
  343. INT NewSubStringSizeInBytes;
  344. } Unicode;
  345. struct {
  346. PCSTR OriginalString;
  347. PCSTR BeginningOfMatch;
  348. PCSTR CurrentString;
  349. PCSTR OldSubString;
  350. PCSTR NewSubString;
  351. INT NewSubStringSizeInBytes;
  352. } Ansi;
  353. };
  354. } REG_REPLACE_DATA, *PREG_REPLACE_DATA;
  355. typedef BOOL(REG_REPLACE_FILTER_PROTOTYPE)(PREG_REPLACE_DATA Data);
  356. typedef REG_REPLACE_FILTER_PROTOTYPE * REG_REPLACE_FILTER;
  357. typedef struct TAG_CHARNODE {
  358. WORD Char;
  359. WORD Flags;
  360. PVOID OriginalStr;
  361. PVOID ReplacementStr;
  362. INT ReplacementBytes;
  363. struct TAG_CHARNODE *NextLevel;
  364. struct TAG_CHARNODE *NextPeer;
  365. } CHARNODE, *PCHARNODE;
  366. typedef struct {
  367. CHARNODE Node;
  368. REG_REPLACE_FILTER Filter;
  369. ULONG_PTR ExtraData;
  370. } CHARNODEEX, *PCHARNODEEX;
  371. typedef struct {
  372. POOLHANDLE Pool;
  373. PCHARNODE FirstLevelRoot;
  374. BOOL UsesExNode;
  375. BOOL UsesFilter;
  376. BOOL UsesExtraData;
  377. } MAPSTRUCT, *PMAPSTRUCT;
  378. //
  379. // APIs
  380. //
  381. PMAPSTRUCT
  382. CreateStringMappingEx (
  383. IN BOOL UsesFilter,
  384. IN BOOL UsesExtraData
  385. );
  386. #define CreateStringMapping() CreateStringMappingEx(FALSE,FALSE)
  387. VOID
  388. DestroyStringMapping (
  389. IN PMAPSTRUCT Map
  390. );
  391. VOID
  392. AddStringMappingPairExA (
  393. IN OUT PMAPSTRUCT Map,
  394. IN PCSTR Old,
  395. IN PCSTR New,
  396. IN REG_REPLACE_FILTER Filter, OPTIONAL
  397. IN ULONG_PTR ExtraData, OPTIONAL
  398. IN DWORD Flags
  399. );
  400. #define AddStringMappingPairA(Map,Old,New) AddStringMappingPairExA(Map,Old,New,NULL,0,0)
  401. VOID
  402. AddStringMappingPairExW (
  403. IN OUT PMAPSTRUCT Map,
  404. IN PCWSTR Old,
  405. IN PCWSTR New,
  406. IN REG_REPLACE_FILTER Filter, OPTIONAL
  407. IN ULONG_PTR ExtraData, OPTIONAL
  408. IN DWORD Flags
  409. );
  410. #define AddStringMappingPairW(Map,Old,New) AddStringMappingPairExW(Map,Old,New,NULL,0,0)
  411. BOOL
  412. MappingSearchAndReplaceExA (
  413. IN PMAPSTRUCT Map,
  414. IN PCSTR SrcBuffer,
  415. OUT PSTR Buffer, // can be the same as SrcBuffer
  416. IN INT InboundBytes, OPTIONAL
  417. OUT PINT OutboundBytesPtr, OPTIONAL
  418. IN INT MaxSizeInBytes,
  419. IN DWORD Flags,
  420. OUT ULONG_PTR *ExtraDataValue, OPTIONAL
  421. OUT PCSTR *EndOfString OPTIONAL
  422. );
  423. #define MappingSearchAndReplaceA(map,buffer,maxbytes) MappingSearchAndReplaceExA(map,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
  424. BOOL
  425. MappingSearchAndReplaceExW (
  426. IN PMAPSTRUCT Map,
  427. IN PCWSTR SrcBuffer,
  428. OUT PWSTR Buffer, // can be the same as SrcBuffer
  429. IN INT InboundBytes, OPTIONAL
  430. OUT PINT OutboundBytes, OPTIONAL
  431. IN INT MaxSizeInBytes,
  432. IN DWORD Flags,
  433. OUT ULONG_PTR *ExtraDataValue, OPTIONAL
  434. OUT PCWSTR *EndOfString OPTIONAL
  435. );
  436. #define MappingSearchAndReplaceW(map,buffer,maxbytes) MappingSearchAndReplaceExW(map,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
  437. BOOL
  438. MappingMultiTableSearchAndReplaceExA (
  439. IN PMAPSTRUCT *MapArray,
  440. IN UINT MapArrayCount,
  441. IN PCSTR SrcBuffer,
  442. OUT PSTR Buffer, // can be the same as SrcBuffer
  443. IN INT InboundBytes, OPTIONAL
  444. OUT PINT OutboundBytesPtr, OPTIONAL
  445. IN INT MaxSizeInBytes,
  446. IN DWORD Flags,
  447. OUT ULONG_PTR *ExtraDataValue, OPTIONAL
  448. OUT PCSTR *EndOfString OPTIONAL
  449. );
  450. #define MappingMultiTableSearchAndReplaceA(array,count,buffer,maxbytes) \
  451. MappingMultiTableSearchAndReplaceExA(array,count,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
  452. BOOL
  453. MappingMultiTableSearchAndReplaceExW (
  454. IN PMAPSTRUCT *MapArray,
  455. IN UINT MapArrayCount,
  456. IN PCWSTR SrcBuffer,
  457. OUT PWSTR Buffer, // can be the same as SrcBuffer
  458. IN INT InboundBytes, OPTIONAL
  459. OUT PINT OutboundBytes, OPTIONAL
  460. IN INT MaxSizeInBytes,
  461. IN DWORD Flags,
  462. OUT ULONG_PTR *ExtraDataValue, OPTIONAL
  463. OUT PCWSTR *EndOfString OPTIONAL
  464. );
  465. #define MappingMultiTableSearchAndReplaceW(array,count,buffer,maxbytes) \
  466. MappingMultiTableSearchAndReplaceExW(array,count,buffer,buffer,0,NULL,maxbytes,0,NULL,NULL)
  467. HANDLE
  468. StartThread (
  469. IN PTHREAD_START_ROUTINE Address,
  470. IN PVOID Arg
  471. );
  472. typedef struct {
  473. WCHAR DisplayName[80];
  474. ULONGLONG Checksum;
  475. WCHAR Version[80];
  476. WCHAR Publisher[80];
  477. WCHAR ProductID[80];
  478. WCHAR RegisteredOwner[80];
  479. WCHAR RegisteredCompany[80];
  480. WCHAR Language[80];
  481. WCHAR SupportUrl[80];
  482. WCHAR SupportTelephone[80];
  483. WCHAR HelpLink[80];
  484. WCHAR InstallLocation[80];
  485. WCHAR InstallSource[80];
  486. WCHAR InstallDate[80];
  487. WCHAR Contact[80];
  488. WCHAR Comments[80];
  489. WCHAR Image[80];
  490. WCHAR ReadmeUrl[80];
  491. WCHAR UpdateInfoUrl[80];
  492. } INSTALLEDAPPW, *PINSTALLEDAPPW;
  493. PINSTALLEDAPPW
  494. GetInstalledAppsW (
  495. IN OUT PGROWBUFFER Buffer,
  496. OUT PUINT Count OPTIONAL
  497. );
  498. typedef PVOID MOVELISTW;
  499. MOVELISTW
  500. AllocateMoveListW (
  501. IN POOLHANDLE PoolHandle
  502. );
  503. //
  504. // Free move list by destrying the pool it was allocated from
  505. //
  506. BOOL
  507. InsertMoveIntoListW (
  508. IN MOVELISTW List,
  509. IN PCWSTR Source,
  510. IN PCWSTR Destination
  511. );
  512. MOVELISTW
  513. RemoveMoveListOverlapW (
  514. IN MOVELISTW List
  515. );
  516. BOOL
  517. OutputMoveListW (
  518. IN HANDLE File,
  519. IN MOVELISTW List, OPTIONAL
  520. IN BOOL AddNestedMoves
  521. );
  522. #ifdef UNICODE
  523. #define g_BootDrivePath g_BootDrivePathW
  524. #define g_BootDrive g_BootDriveW
  525. #define g_BootDriveLetter g_BootDriveLetterW
  526. #define MOVELIST MOVELISTW
  527. #define AllocateMoveList AllocateMoveListW
  528. #define InsertMoveIntoList InsertMoveIntoListW
  529. #define RemoveMoveListOverlap RemoveMoveListOverlapW
  530. #define OutputMoveList OutputMoveListW
  531. #define VERSION_STRUCT VERSION_STRUCTW
  532. #define PVERSION_STRUCT PVERSION_STRUCTW
  533. #define CreateVersionStruct CreateVersionStructW
  534. #define DestroyVersionStruct DestroyVersionStructW
  535. #define EnumFirstVersionTranslation EnumFirstVersionTranslationW
  536. #define EnumNextVersionTranslation EnumNextVersionTranslationW
  537. #define EnumFirstVersionValue EnumFirstVersionValueW
  538. #define EnumNextVersionValue EnumNextVersionValueW
  539. #define PINSTALLEDAPP PINSTALLEDAPPW
  540. #define GetInstalledApps GetInstalledAppsW
  541. #define AddStringMappingPairEx AddStringMappingPairExW
  542. #define AddStringMappingPair AddStringMappingPairW
  543. #define MappingSearchAndReplaceEx MappingSearchAndReplaceExW
  544. #define MappingSearchAndReplace MappingSearchAndReplaceW
  545. #define MappingMultiTableSearchAndReplaceEx MappingMultiTableSearchAndReplaceExW
  546. #define MappingMultiTableSearchAndReplace MappingMultiTableSearchAndReplaceW
  547. #else
  548. #define g_BootDrivePath g_BootDrivePathA
  549. #define g_BootDrive g_BootDriveA
  550. #define g_BootDriveLetter g_BootDriveLetterA
  551. #define VERSION_STRUCT VERSION_STRUCTA
  552. #define PVERSION_STRUCT PVERSION_STRUCTA
  553. #define CreateVersionStruct CreateVersionStructA
  554. #define DestroyVersionStruct DestroyVersionStructA
  555. #define EnumFirstVersionTranslation EnumFirstVersionTranslationA
  556. #define EnumNextVersionTranslation EnumNextVersionTranslationA
  557. #define EnumFirstVersionValue EnumFirstVersionValueA
  558. #define EnumNextVersionValue EnumNextVersionValueA
  559. #define AddStringMappingPairEx AddStringMappingPairExA
  560. #define AddStringMappingPair AddStringMappingPairA
  561. #define MappingSearchAndReplaceEx MappingSearchAndReplaceExA
  562. #define MappingSearchAndReplace MappingSearchAndReplaceA
  563. #define MappingMultiTableSearchAndReplaceEx MappingMultiTableSearchAndReplaceExA
  564. #define MappingMultiTableSearchAndReplace MappingMultiTableSearchAndReplaceA
  565. #endif
  566. #ifdef __cplusplus
  567. }
  568. #endif