Leaked source code of windows server 2003
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.

517 lines
14 KiB

  1. /*++
  2. Copyright (c) 1996-1997 Microsoft Corporation
  3. Module Name:
  4. parser.c
  5. Abstract:
  6. Common functions shared by both PPD and PPD parsers
  7. Environment:
  8. Windows NT printer drivers
  9. Revision History:
  10. 01/22/97 -davidx-
  11. Add PtstrGetDefaultTTSubstTable.
  12. 12/03/96 -davidx-
  13. Check binary file date against all source printer description files.
  14. 08/16/96 -davidx-
  15. Created it.
  16. --*/
  17. #include "lib.h"
  18. BOOL
  19. BIsRawBinaryDataUpToDate(
  20. IN PRAWBINARYDATA pRawData
  21. )
  22. /*++
  23. Routine Description:
  24. Check if the raw binary data is up-to-date
  25. Arguments:
  26. pRawData - pointer to raw binary printer description data
  27. Return Value:
  28. TRUE if the raw binary data is up-to-date;
  29. FALSE if the timestamp for any of the source file has changed
  30. since the binary data was generated.
  31. --*/
  32. {
  33. //
  34. // This function is only available in user-mode.
  35. // It always returns TRUE when called from kernel-mode.
  36. // Only the KERNEL_MODE define now means render-module
  37. // and we added the capability of parsing from the render modula
  38. #if defined(KERNEL_MODE) && !defined(USERMODE_DRIVER)
  39. return TRUE;
  40. #else //
  41. PFILEDATEINFO pFileDateInfo;
  42. DWORD dwCount;
  43. PTSTR ptstrFilename;
  44. HANDLE hFile;
  45. FILETIME FileTime;
  46. BOOL bUpToDate = TRUE;
  47. pFileDateInfo = OFFSET_TO_POINTER(pRawData, pRawData->FileDateInfo.loOffset);
  48. dwCount = pRawData->FileDateInfo.dwCount;
  49. ASSERT(dwCount == 0 || pFileDateInfo != NULL);
  50. while (dwCount-- > 0)
  51. {
  52. ptstrFilename = OFFSET_TO_POINTER(pRawData, pFileDateInfo[dwCount].loFileName);
  53. ASSERT(ptstrFilename != NULL);
  54. bUpToDate = FALSE;
  55. hFile = CreateFile(ptstrFilename,
  56. GENERIC_READ,
  57. FILE_SHARE_READ,
  58. NULL,
  59. OPEN_EXISTING,
  60. FILE_ATTRIBUTE_NORMAL | SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS,
  61. NULL);
  62. if (hFile != INVALID_HANDLE_VALUE)
  63. {
  64. if (GetFileTime(hFile, NULL, NULL, &FileTime))
  65. bUpToDate = (CompareFileTime(&FileTime, &pFileDateInfo[dwCount].FileTime) == 0);
  66. else
  67. ERR(("GetFileTime '%ws' failed: %d\n", ptstrFilename, GetLastError()));
  68. CloseHandle(hFile);
  69. }
  70. else
  71. ERR(("CreateFile '%ws' failed: %d\n", ptstrFilename, GetLastError()));
  72. }
  73. if (! bUpToDate)
  74. TERSE(("Raw binary data file is out-of-date.\n"));
  75. return bUpToDate;
  76. #endif //!KERNEL_MODE
  77. }
  78. PFEATURE
  79. PGetIndexedFeature(
  80. PUIINFO pUIInfo,
  81. DWORD dwFeatureIndex
  82. )
  83. /*++
  84. Routine Description:
  85. Given a UIINFO structure and a feature index, return a pointer to
  86. the FEATURE structure corresponding to the specified feature.
  87. Arguments:
  88. pUIInfo - Points to a UIINFO structure
  89. dwFeatureIndex - Specifies the index of the requested feature
  90. Return Value:
  91. Pointer to the requested FEATURE, NULL if there is an error
  92. --*/
  93. {
  94. ASSERT(pUIInfo != NULL);
  95. if (dwFeatureIndex < pUIInfo->dwDocumentFeatures + pUIInfo->dwPrinterFeatures)
  96. {
  97. return ((PFEATURE) ((PBYTE) pUIInfo->pInfoHeader + pUIInfo->loFeatureList)) +
  98. dwFeatureIndex;
  99. } else
  100. return NULL;
  101. }
  102. POPTION
  103. PGetNamedOption(
  104. PUIINFO pUIInfo,
  105. PFEATURE pFeature,
  106. PCSTR pstrOptionName,
  107. PDWORD pdwOptionIndex
  108. )
  109. /*++
  110. Routine Description:
  111. Find the option whose keyword string matches the specified name
  112. Arguments:
  113. pUIInfo - Points to a UIINFO structure
  114. pFeature - Points to the feature in question
  115. pstrOptionName - Specifies the name of the interested option
  116. pdwOptionIndex - Returns the index of the option found
  117. Return Value:
  118. Pointer to the OPTION structure whose keyword string matches
  119. the specified option name; NULL if the specified feature is not found
  120. --*/
  121. {
  122. POPTION pOption;
  123. DWORD dwIndex, dwOptionCount, dwOptionSize;
  124. PCSTR pstrName;
  125. ASSERT(pFeature);
  126. dwOptionSize = pFeature->dwOptionSize;
  127. pOption = PGetIndexedOption(pUIInfo, pFeature, 0);
  128. dwOptionCount = pFeature->Options.dwCount;
  129. if (pOption != NULL && dwOptionCount)
  130. {
  131. for (dwIndex=0; dwIndex < dwOptionCount; dwIndex++)
  132. {
  133. pstrName = OFFSET_TO_POINTER(pUIInfo->pubResourceData, pOption->loKeywordName);
  134. ASSERT(pstrName != NULL);
  135. if (pstrName && (strcmp(pstrOptionName, pstrName) == EQUAL_STRING))
  136. {
  137. *pdwOptionIndex = dwIndex;
  138. return (pOption);
  139. }
  140. pOption = (POPTION)((PBYTE)pOption + dwOptionSize);
  141. }
  142. }
  143. if (pdwOptionIndex)
  144. *pdwOptionIndex = OPTION_INDEX_ANY;
  145. return NULL;
  146. }
  147. PFEATURE
  148. PGetNamedFeature(
  149. PUIINFO pUIInfo,
  150. PCSTR pstrFeatureName,
  151. PDWORD pdwFeatureIndex
  152. )
  153. /*++
  154. Routine Description:
  155. Find the feature whose keyword string matches the specified name
  156. Arguments:
  157. pUIInfo - Points to a UIINFO structure
  158. pstrFeatureName - Specifies the name of the interested feature
  159. pdwFeatureIndex - Returns the index of the feature found
  160. Return Value:
  161. Pointer to the FEATURE structure whose keyword string matches
  162. the specified feature name; NULL if the specified feature is not found
  163. --*/
  164. {
  165. PFEATURE pFeature;
  166. DWORD dwIndex, dwFeatureCount;
  167. PCSTR pstrName;
  168. pFeature = OFFSET_TO_POINTER(pUIInfo->pInfoHeader, pUIInfo->loFeatureList);
  169. if (pFeature != NULL)
  170. {
  171. dwFeatureCount = pUIInfo->dwDocumentFeatures + pUIInfo->dwPrinterFeatures;
  172. for (dwIndex=0; dwIndex < dwFeatureCount; dwIndex++, pFeature++)
  173. {
  174. pstrName = OFFSET_TO_POINTER(pUIInfo->pubResourceData, pFeature->loKeywordName);
  175. ASSERT(pstrName != NULL);
  176. if (strcmp(pstrFeatureName, pstrName) == EQUAL_STRING)
  177. {
  178. *pdwFeatureIndex = dwIndex;
  179. return pFeature;
  180. }
  181. }
  182. }
  183. *pdwFeatureIndex = 0xffffffff;
  184. return NULL;
  185. }
  186. PVOID
  187. PGetIndexedOption(
  188. PUIINFO pUIInfo,
  189. PFEATURE pFeature,
  190. DWORD dwOptionIndex
  191. )
  192. /*++
  193. Routine Description:
  194. Given UIINFO and FEATURE structures and an option index, return a pointer to
  195. the OPTION structure corresponding to the specified feature option
  196. Arguments:
  197. pUIInfo - Points to a UIINFO structure
  198. pFeature - Specifies the feature whose option the caller is interested in
  199. dwOptionIndex - Specifies the index of the requested option
  200. Return Value:
  201. Pointer to the request OPTION, NULL if there is an error
  202. --*/
  203. {
  204. ASSERT(pUIInfo != NULL && pFeature != NULL);
  205. if (dwOptionIndex < pFeature->Options.dwCount)
  206. {
  207. return (PBYTE) pUIInfo->pInfoHeader +
  208. (pFeature->Options.loOffset + (dwOptionIndex * pFeature->dwOptionSize));
  209. } else
  210. return NULL;
  211. }
  212. PVOID
  213. PGetIndexedFeatureOption(
  214. PUIINFO pUIInfo,
  215. DWORD dwFeatureIndex,
  216. DWORD dwOptionIndex
  217. )
  218. /*++
  219. Routine Description:
  220. Given a UIINFO structure, a feature index, and an option index,
  221. return a pointer to the OPTION structure corresponding to
  222. the specified feature option
  223. Arguments:
  224. pUIInfo - Points to a UIINFO structure
  225. dwFeatureIndex - Specifies the index of the specified feature
  226. dwOptionIndex - Specifies the index of the requested option
  227. Return Value:
  228. Pointer to the request OPTION, NULL if there is an error
  229. --*/
  230. {
  231. PFEATURE pFeature = PGetIndexedFeature(pUIInfo, dwFeatureIndex);
  232. return pFeature ? PGetIndexedOption(pUIInfo, pFeature, dwOptionIndex) : NULL;
  233. }
  234. PPAGESIZE
  235. PGetCustomPageSizeOption(
  236. PUIINFO pUIInfo
  237. )
  238. /*++
  239. Routine Description:
  240. Return a pointer to the PAGESIZE option structure which
  241. contains custom page size information (e.g. max width and height)
  242. Arguments:
  243. pUIInfo - Points to UIINFO structure
  244. Return Value:
  245. See above.
  246. --*/
  247. {
  248. PFEATURE pFeature;
  249. return (SUPPORT_CUSTOMSIZE(pUIInfo) &&
  250. (pFeature = GET_PREDEFINED_FEATURE(pUIInfo, GID_PAGESIZE))) ?
  251. PGetIndexedOption(pUIInfo, pFeature, pUIInfo->dwCustomSizeOptIndex) : NULL;
  252. }
  253. VOID
  254. VCopyOptionSelections(
  255. OUT POPTSELECT pDestOptions,
  256. IN INT iDestIndex,
  257. IN POPTSELECT pSrcOptions,
  258. IN INT iSrcIndex,
  259. IN OUT PINT piNext,
  260. IN INT iMaxOptions
  261. )
  262. /*++
  263. Routine Description:
  264. Copy the current option selections for a single feature from
  265. the source OPTSELECT array to the destination OPTSELECT array
  266. Arguments:
  267. pDestOptions - Points to the destination OPTSELECT array
  268. iDestIndex - Specifies the destination entry in pDestOptions
  269. pSrcOptions - Points to the source OPTSELECT array
  270. iSrcIndex - Specifies the source entry in pSrcOptions
  271. piNext - On input, it contains the index of next available entry
  272. in pDestOptions if there are more than one option selected.
  273. On output, it's updated to point to the next available entry
  274. in pDestOptions after any overflow selections are copied.
  275. iMaxOptions - Maximum number of entries in pDestOptions
  276. Return Value:
  277. NONE
  278. --*/
  279. {
  280. pDestOptions[iDestIndex].ubCurOptIndex = pSrcOptions[iSrcIndex].ubCurOptIndex;
  281. while ((iSrcIndex = pSrcOptions[iSrcIndex].ubNext) != NULL_OPTSELECT)
  282. {
  283. if (*piNext < iMaxOptions)
  284. {
  285. INT iLastDestIndex;
  286. iLastDestIndex = iDestIndex;
  287. iDestIndex = *piNext;
  288. pDestOptions[iLastDestIndex].ubNext = (BYTE) iDestIndex;
  289. pDestOptions[iDestIndex].ubCurOptIndex = pSrcOptions[iSrcIndex].ubCurOptIndex;
  290. }
  291. (*piNext)++;
  292. }
  293. pDestOptions[iDestIndex].ubNext = NULL_OPTSELECT;
  294. }
  295. //
  296. // 32 bit ANSI X3.66 CRC checksum table - polynomial 0xedb88320
  297. //
  298. // Copyright (C) 1986 Gary S. Brown. You may use this program, or
  299. // code or tables extracted from it, as desired without restriction.
  300. //
  301. static CONST DWORD Crc32Table[] = {
  302. 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
  303. 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
  304. 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
  305. 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
  306. 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
  307. 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
  308. 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
  309. 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
  310. 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
  311. 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
  312. 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
  313. 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
  314. 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
  315. 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
  316. 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
  317. 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
  318. 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
  319. 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
  320. 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
  321. 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
  322. 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
  323. 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
  324. 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
  325. 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
  326. 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
  327. 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
  328. 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
  329. 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
  330. 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
  331. 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
  332. 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
  333. 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
  334. };
  335. DWORD
  336. ComputeCrc32Checksum(
  337. IN PBYTE pbuf,
  338. IN DWORD dwCount,
  339. IN DWORD dwChecksum
  340. )
  341. /*++
  342. Routine Description:
  343. Compute the 32-bit CRC checksum on a buffer of data
  344. Arguments:
  345. pbuf - Points to a data buffer
  346. dwCount - Number of bytes in the data buffer
  347. dwChecksum - Initial checksum value
  348. Return Value:
  349. Resulting checksum value
  350. --*/
  351. {
  352. while (dwCount--)
  353. dwChecksum = Crc32Table[(dwChecksum ^ *pbuf++) & 0xff] ^ (dwChecksum >> 8);
  354. return dwChecksum;
  355. }