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.

313 lines
6.6 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996 - 1997.
  5. //
  6. // File: iisurshl.cxx
  7. //
  8. // Contents: IIS unmarshalling code
  9. //
  10. // Functions:
  11. //
  12. // History: 01-Mar-97 SophiaC Created.
  13. //
  14. //----------------------------------------------------------------------------
  15. #include "iis.hxx"
  16. HRESULT
  17. IISTypeInit(
  18. PIISOBJECT pIISType
  19. )
  20. {
  21. memset(pIISType, 0, sizeof(IISOBJECT));
  22. RRETURN(S_OK);
  23. }
  24. LPBYTE
  25. CopyIISDWORD_To_IISSynIdDWORD(
  26. LPBYTE lpByte,
  27. PIISOBJECT lpIISObject
  28. )
  29. {
  30. lpIISObject->IISType = IIS_SYNTAX_ID_DWORD;
  31. lpIISObject->IISValue.value_1.dwDWORD = *(DWORD UNALIGNED *)lpByte;
  32. return(lpByte);
  33. }
  34. LPBYTE
  35. CopyIISSTRING_To_IISSynIdSTRING(
  36. LPBYTE lpByte,
  37. PIISOBJECT lpIISObject
  38. )
  39. {
  40. DWORD dwStatus = 0;
  41. lpIISObject->IISType = IIS_SYNTAX_ID_STRING;
  42. lpIISObject->IISValue.value_2.String =
  43. (LPWSTR)AllocADsStr((LPWSTR)lpByte);
  44. return(lpByte);
  45. }
  46. LPBYTE
  47. CopyIISEXPANDSZ_To_IISSynIdEXPANDSZ(
  48. LPBYTE lpByte,
  49. PIISOBJECT lpIISObject
  50. )
  51. {
  52. DWORD dwStatus = 0;
  53. lpIISObject->IISType = IIS_SYNTAX_ID_EXPANDSZ;
  54. lpIISObject->IISValue.value_3.ExpandSz =
  55. (LPWSTR)AllocADsStr((LPWSTR)lpByte);
  56. return(lpByte);
  57. }
  58. LPBYTE
  59. CopyIISMULTISZ_To_IISSynIdMULTISZ(
  60. LPBYTE lpByte,
  61. PIISOBJECT lpIISObject,
  62. DWORD dwNumValues
  63. )
  64. {
  65. DWORD dwStatus = 0;
  66. LPWSTR pszCurrPosition = NULL;
  67. DWORD i;
  68. //
  69. // scan multi-sz string and store each string in an IISObject object
  70. //
  71. pszCurrPosition = (LPWSTR) lpByte;
  72. for (i = 0; i < dwNumValues; i++) {
  73. //
  74. // copy each string to IISObject structure
  75. //
  76. lpIISObject[i].IISType = IIS_SYNTAX_ID_MULTISZ;
  77. lpIISObject[i].IISValue.value_4.MultiSz =
  78. (LPWSTR)AllocADsStr((LPWSTR)pszCurrPosition);
  79. while (*pszCurrPosition != L'\0') {
  80. pszCurrPosition++;
  81. }
  82. pszCurrPosition++;
  83. }
  84. return(lpByte);
  85. }
  86. LPBYTE
  87. CopyIISBINARY_To_IISSynIdBINARY(
  88. LPBYTE lpByte,
  89. PIISOBJECT lpIISObject,
  90. DWORD dwSyntaxId,
  91. DWORD dwNumValues
  92. )
  93. {
  94. LPBYTE pBuffer = NULL;
  95. lpIISObject->IISType = dwSyntaxId;
  96. pBuffer = (LPBYTE) AllocADsMem(dwNumValues);
  97. if (!pBuffer) {
  98. return(lpByte);
  99. }
  100. memcpy(pBuffer, lpByte, dwNumValues);
  101. lpIISObject->IISValue.value_5.Binary = pBuffer;
  102. lpIISObject->IISValue.value_5.Length = dwNumValues;
  103. return(lpByte);
  104. }
  105. LPBYTE
  106. CopyIISMIMEMAP_To_IISSynIdMIMEMAP(
  107. LPBYTE lpByte,
  108. PIISOBJECT lpIISObject,
  109. DWORD dwNumValues
  110. )
  111. {
  112. DWORD dwStatus = 0;
  113. LPWSTR pszUnicode = NULL;
  114. LPWSTR pszCurrPosition = NULL;
  115. DWORD i;
  116. //
  117. // scan multi-sz string and store each string in an IISObject object
  118. //
  119. pszCurrPosition = (LPWSTR) lpByte;
  120. for (i = 0; i < dwNumValues; i++) {
  121. //
  122. // copy each string to IISObject structure
  123. //
  124. lpIISObject[i].IISType = IIS_SYNTAX_ID_MIMEMAP;
  125. lpIISObject[i].IISValue.value_6.MimeMap =
  126. (LPWSTR)AllocADsStr((LPWSTR)pszCurrPosition);
  127. while (*pszCurrPosition != L'\0') {
  128. pszCurrPosition++;
  129. }
  130. pszCurrPosition++;
  131. }
  132. return(lpByte);
  133. }
  134. LPBYTE
  135. CopyIISBOOL_To_IISSynIdBOOL(
  136. LPBYTE lpByte,
  137. PIISOBJECT lpIISObject,
  138. DWORD dwSyntaxId
  139. )
  140. {
  141. lpIISObject->IISType = dwSyntaxId;
  142. lpIISObject->IISValue.value_1.dwDWORD = *(PDWORD)lpByte;
  143. return(lpByte);
  144. }
  145. LPBYTE
  146. CopyIISToIISSynId(
  147. DWORD dwSyntaxId,
  148. DWORD dwNumValues,
  149. LPBYTE pTemp,
  150. PIISOBJECT lpIISObject
  151. )
  152. {
  153. switch (dwSyntaxId) {
  154. case IIS_SYNTAX_ID_DWORD:
  155. pTemp = CopyIISDWORD_To_IISSynIdDWORD(
  156. pTemp,
  157. lpIISObject
  158. );
  159. break;
  160. case IIS_SYNTAX_ID_STRING:
  161. pTemp = CopyIISSTRING_To_IISSynIdSTRING(
  162. pTemp,
  163. lpIISObject
  164. );
  165. break;
  166. case IIS_SYNTAX_ID_EXPANDSZ:
  167. pTemp = CopyIISEXPANDSZ_To_IISSynIdEXPANDSZ(
  168. pTemp,
  169. lpIISObject
  170. );
  171. break;
  172. case IIS_SYNTAX_ID_MULTISZ:
  173. pTemp = CopyIISMULTISZ_To_IISSynIdMULTISZ(
  174. pTemp,
  175. lpIISObject,
  176. dwNumValues
  177. );
  178. break;
  179. case IIS_SYNTAX_ID_BINARY:
  180. case IIS_SYNTAX_ID_IPSECLIST:
  181. case IIS_SYNTAX_ID_NTACL:
  182. pTemp = CopyIISBINARY_To_IISSynIdBINARY(
  183. pTemp,
  184. lpIISObject,
  185. dwSyntaxId,
  186. dwNumValues
  187. );
  188. break;
  189. case IIS_SYNTAX_ID_MIMEMAP:
  190. pTemp = CopyIISMIMEMAP_To_IISSynIdMIMEMAP(
  191. pTemp,
  192. lpIISObject,
  193. dwNumValues
  194. );
  195. break;
  196. case IIS_SYNTAX_ID_BOOL:
  197. case IIS_SYNTAX_ID_BOOL_BITMASK:
  198. pTemp = CopyIISBOOL_To_IISSynIdBOOL(
  199. pTemp,
  200. lpIISObject,
  201. dwSyntaxId
  202. );
  203. break;
  204. default:
  205. break;
  206. }
  207. return(pTemp);
  208. }
  209. HRESULT
  210. UnMarshallIISToIISSynId(
  211. DWORD dwSyntaxId,
  212. DWORD dwNumValues,
  213. LPBYTE lpByte,
  214. PIISOBJECT * ppIISObject
  215. )
  216. {
  217. DWORD i = 0;
  218. PIISOBJECT pIISObject = NULL;
  219. //
  220. // For binary type, dwNumValues is the number of bytes
  221. //
  222. if (dwSyntaxId == IIS_SYNTAX_ID_BINARY ||
  223. dwSyntaxId == IIS_SYNTAX_ID_IPSECLIST ||
  224. dwSyntaxId == IIS_SYNTAX_ID_NTACL) {
  225. pIISObject = (PIISOBJECT)AllocADsMem(
  226. sizeof(IISOBJECT)
  227. );
  228. }
  229. else {
  230. pIISObject = (PIISOBJECT)AllocADsMem(
  231. dwNumValues * sizeof(IISOBJECT)
  232. );
  233. }
  234. if (!pIISObject) {
  235. RRETURN(E_FAIL);
  236. }
  237. lpByte = CopyIISToIISSynId(
  238. dwSyntaxId,
  239. dwNumValues,
  240. lpByte,
  241. pIISObject
  242. );
  243. *ppIISObject = pIISObject;
  244. RRETURN(S_OK);
  245. }