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.

245 lines
5.3 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: libmain.cxx
  7. //
  8. // Contents: LibMain for nds.dll
  9. //
  10. // Functions: LibMain, DllGetClassObject
  11. //
  12. // History: 25-Oct-94 KrishnaG Created.
  13. //
  14. //----------------------------------------------------------------------------
  15. #include "nds.hxx"
  16. #pragma hdrstop
  17. HRESULT
  18. ConvertNDSAclVArrayToSecDesVar(
  19. PVARIANT pVarArrayNDSAcl,
  20. PVARIANT pVarSecDes
  21. )
  22. {
  23. HRESULT hr = S_OK;
  24. IADsSecurityDescriptor * pSecDes = NULL;
  25. IDispatch * pDispatch = NULL;
  26. VARIANT varDACL;
  27. VariantInit(pVarSecDes);
  28. memset(&varDACL, 0, sizeof(VARIANT));
  29. hr = ConvertNDSAclVArrayToAclVariant(
  30. pVarArrayNDSAcl,
  31. &varDACL
  32. );
  33. BAIL_ON_FAILURE(hr);
  34. hr = CoCreateInstance(
  35. CLSID_SecurityDescriptor,
  36. NULL,
  37. CLSCTX_INPROC_SERVER,
  38. IID_IADsSecurityDescriptor,
  39. (void **)&pSecDes
  40. );
  41. BAIL_ON_FAILURE(hr);
  42. hr = pSecDes->put_DiscretionaryAcl(V_DISPATCH(&varDACL));
  43. BAIL_ON_FAILURE(hr);
  44. hr = pSecDes->QueryInterface(IID_IDispatch, (void**)&pDispatch);
  45. BAIL_ON_FAILURE(hr);
  46. V_VT(pVarSecDes) = VT_DISPATCH;
  47. V_DISPATCH(pVarSecDes) = pDispatch;
  48. error:
  49. if (pSecDes) {
  50. pSecDes->Release();
  51. }
  52. RRETURN(hr);
  53. }
  54. HRESULT
  55. ConvertNDSAclVArrayToAclVariant(
  56. PVARIANT pVarArrayNDSACL,
  57. PVARIANT pVarACL
  58. )
  59. {
  60. IADsAccessControlList *pAccessControlList = NULL;
  61. IDispatch *pDispatch = NULL;
  62. VARIANT *pVarArray = NULL;
  63. VARIANT varAce;
  64. DWORD i = 0;
  65. HRESULT hr = S_OK;
  66. DWORD dwNumValues;
  67. DWORD dwNewAceCount = 0;
  68. VariantInit(pVarACL);
  69. hr = CoCreateInstance(
  70. CLSID_AccessControlList,
  71. NULL,
  72. CLSCTX_INPROC_SERVER,
  73. IID_IADsAccessControlList,
  74. (void **)&pAccessControlList
  75. );
  76. BAIL_ON_FAILURE(hr);
  77. hr = ConvertSafeArrayToVariantArray(
  78. *pVarArrayNDSACL,
  79. &pVarArray,
  80. &dwNumValues
  81. );
  82. BAIL_ON_FAILURE(hr);
  83. for (i = 0; i < dwNumValues; i++) {
  84. hr = ConvertNDSAclVariantToAceVariant(
  85. &(pVarArray[i]),
  86. (PVARIANT)&varAce
  87. );
  88. hr = pAccessControlList->AddAce(V_DISPATCH(&varAce));
  89. if (SUCCEEDED(hr)) {
  90. dwNewAceCount++;
  91. }
  92. VariantClear(&varAce);
  93. }
  94. pAccessControlList->put_AceCount(dwNewAceCount);
  95. hr = pAccessControlList->QueryInterface(
  96. IID_IDispatch,
  97. (void **)&pDispatch
  98. );
  99. V_VT(pVarACL) = VT_DISPATCH;
  100. V_DISPATCH(pVarACL) = pDispatch;
  101. error:
  102. if (pAccessControlList) {
  103. pAccessControlList->Release();
  104. }
  105. if (pVarArray)
  106. {
  107. DWORD i = 0;
  108. for (i = 0; i < dwNumValues; i++) {
  109. VariantClear(pVarArray + i);
  110. }
  111. FreeADsMem(pVarArray);
  112. }
  113. RRETURN(hr);
  114. }
  115. HRESULT
  116. ConvertNDSAclVariantToAceVariant(
  117. PVARIANT pvarNDSAce,
  118. PVARIANT pvarAce
  119. )
  120. {
  121. HRESULT hr = S_OK;
  122. IADsAccessControlEntry *pAccessControlEntry = NULL;
  123. IDispatch *pDispatch = NULL;
  124. IADsAcl *pSecDes = NULL;
  125. DWORD dwPrivileges = 0;
  126. BSTR bstrProtectedAttrName = NULL;
  127. BSTR bstrSubjectName = NULL;
  128. if (V_VT(pvarNDSAce) != VT_DISPATCH){
  129. hr = E_FAIL;
  130. BAIL_ON_FAILURE(hr);
  131. }
  132. pDispatch = V_DISPATCH(pvarNDSAce);
  133. hr = pDispatch->QueryInterface(
  134. IID_IADsAcl,
  135. (void **)&pSecDes
  136. );
  137. BAIL_ON_FAILURE(hr);
  138. hr = pSecDes->get_ProtectedAttrName(
  139. &bstrProtectedAttrName
  140. );
  141. BAIL_ON_FAILURE(hr);
  142. hr = pSecDes->get_SubjectName(
  143. &bstrSubjectName
  144. );
  145. BAIL_ON_FAILURE(hr);
  146. hr = pSecDes->get_Privileges(
  147. (LONG *)&dwPrivileges);
  148. BAIL_ON_FAILURE(hr);
  149. VariantInit(pvarAce);
  150. hr = CoCreateInstance(
  151. CLSID_AccessControlEntry,
  152. NULL,
  153. CLSCTX_INPROC_SERVER,
  154. IID_IADsAccessControlEntry,
  155. (void **)&pAccessControlEntry
  156. );
  157. BAIL_ON_FAILURE(hr);
  158. hr = pAccessControlEntry->put_AccessMask(dwPrivileges);
  159. BAIL_ON_FAILURE(hr);
  160. hr = pAccessControlEntry->put_Trustee(bstrSubjectName);
  161. BAIL_ON_FAILURE(hr);
  162. hr = pAccessControlEntry->put_ObjectType(bstrProtectedAttrName);
  163. BAIL_ON_FAILURE(hr);
  164. hr = pAccessControlEntry->QueryInterface(
  165. IID_IDispatch,
  166. (void **)&pDispatch
  167. );
  168. BAIL_ON_FAILURE(hr);
  169. V_DISPATCH(pvarAce) = pDispatch;
  170. V_VT(pvarAce) = VT_DISPATCH;
  171. cleanup:
  172. if (pSecDes) {
  173. pSecDes->Release();
  174. }
  175. if (pAccessControlEntry) {
  176. pAccessControlEntry->Release();
  177. }
  178. RRETURN(hr);
  179. error:
  180. if (pDispatch) {
  181. pDispatch->Release();
  182. }
  183. if (pSecDes) {
  184. pSecDes->Release();
  185. }
  186. if (pAccessControlEntry) {
  187. pAccessControlEntry->Release();
  188. }
  189. goto cleanup;
  190. }