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.

484 lines
15 KiB

  1. /********************************************************************/
  2. /** Microsoft LAN Manager **/
  3. /** Copyright(c) Microsoft Corp., 1987-1990 **/
  4. /********************************************************************/
  5. /*
  6. * FILE STATUS:
  7. * 1/02/91 Created
  8. * 1/12/91 Split from Logon App, reduced to just Shell Test APP
  9. * 2/21/91 Disabled
  10. * Johnl 12/28/91 Created DACL Editor test
  11. */
  12. /****************************************************************************
  13. PROGRAM: test4.cxx
  14. PURPOSE: Test the SedDiscretionaryAclEditor API
  15. FUNCTIONS:
  16. test4()
  17. COMMENTS:
  18. ****************************************************************************/
  19. #ifdef CODESPEC
  20. /*START CODESPEC*/
  21. /********
  22. TEST4.CXX
  23. ********/
  24. /************
  25. end TEST4.CXX
  26. ************/
  27. /*END CODESPEC*/
  28. #endif // CODESPEC
  29. #include <ntstuff.hxx>
  30. #define INCL_NETLIB
  31. #define INCL_WINDOWS
  32. #define INCL_NETERRORS
  33. #define INCL_DOSERRORS
  34. #include <lmui.hxx>
  35. #include <string.hxx>
  36. #include <security.hxx>
  37. #include <uibuffer.hxx>
  38. extern "C"
  39. {
  40. #include <sedapi.h>
  41. }
  42. #include <uiassert.hxx>
  43. #include "apptest.hxx"
  44. #define CALLBACK_CONTEXT 0x12345678
  45. DWORD SedCallback( ULONG_PTR ulCallbackContext,
  46. PSECURITY_DESCRIPTOR psecdesc,
  47. BOOLEAN fApplyToSubContainers,
  48. BOOLEAN fApplyToSubObjects,
  49. LPDWORD StatusReturn
  50. ) ;
  51. /* Individual permission bits, these show up in the Special permission dialog
  52. */
  53. #define TEST_SPECIAL_PERM1 0x00000001
  54. #define TEST_SPECIAL_PERM2 0x00000002
  55. #define TEST_SPECIAL_PERM3 0x00000004
  56. #define TEST_SPECIAL_PERM4 0x00000008
  57. #define TEST_SPECIAL_PERM5 0x00000010
  58. /* Sets of permission bits (these are shown in the main dialog)
  59. */
  60. #define TEST_RESOURCE_NO_ACCESS (0)
  61. #define TEST_RESOURCE_PERM12 (TEST_SPECIAL_PERM1|TEST_SPECIAL_PERM2)
  62. #define TEST_RESOURCE_PERM34 (TEST_SPECIAL_PERM3|TEST_SPECIAL_PERM4)
  63. #define TEST_RESOURCE_PERM135 (TEST_SPECIAL_PERM1|TEST_SPECIAL_PERM3|TEST_SPECIAL_PERM5)
  64. #define TEST_RESOURCE_PERM4 (TEST_SPECIAL_PERM4)
  65. /* Individual permission bits, these show up in the Special permission dialog
  66. */
  67. #define TEST_NEW_OBJ_SPECIAL_PERM1 0x00000020
  68. #define TEST_NEW_OBJ_SPECIAL_PERM2 0x00000040
  69. #define TEST_NEW_OBJ_SPECIAL_PERM3 0x00000080
  70. #define TEST_NEW_OBJ_SPECIAL_PERM4 0x00000100
  71. #define TEST_NEW_OBJ_SPECIAL_PERM5 0x00000200
  72. #define TEST_NEW_OBJ_SPECIAL_NO_ACCESS (0)
  73. #define TEST_NEW_OBJ_SPECIAL_PERM12 (TEST_NEW_OBJ_SPECIAL_PERM1|TEST_NEW_OBJ_SPECIAL_PERM2)
  74. #define TEST_NEW_OBJ_SPECIAL_PERM34 (TEST_NEW_OBJ_SPECIAL_PERM3|TEST_NEW_OBJ_SPECIAL_PERM4)
  75. SED_APPLICATION_ACCESS sedappaccessNoNewObj[] =
  76. { { SED_DESC_TYPE_RESOURCE, TEST_RESOURCE_NO_ACCESS,0, SZ("No Access")},
  77. { SED_DESC_TYPE_RESOURCE, TEST_RESOURCE_PERM12, 0, SZ("Resource perms with 1, 2")},
  78. { SED_DESC_TYPE_RESOURCE, TEST_RESOURCE_PERM34, 0, SZ("Resource perms with 3, 4")},
  79. { SED_DESC_TYPE_RESOURCE, TEST_RESOURCE_PERM135, 0, SZ("Resource perms with 1, 3, 5")},
  80. { SED_DESC_TYPE_RESOURCE, TEST_RESOURCE_PERM4, 0, SZ("Resource perms with 4")},
  81. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM1, 0, SZ("Perm bit 1")},
  82. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM2, 0, SZ("Perm bit 2")},
  83. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM3, 0, SZ("Perm bit 3")},
  84. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM4, 0, SZ("Perm bit 4")},
  85. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM5, 0, SZ("Perm bit 5")}
  86. } ;
  87. SED_APPLICATION_ACCESS sedappaccessNewObj[] =
  88. { { SED_DESC_TYPE_CONT_AND_NEW_OBJECT, TEST_RESOURCE_NO_ACCESS,TEST_NEW_OBJ_SPECIAL_NO_ACCESS, SZ("No Access")},
  89. { SED_DESC_TYPE_CONT_AND_NEW_OBJECT, TEST_RESOURCE_PERM12, TEST_NEW_OBJ_SPECIAL_PERM12, SZ("Resource perms with 1, 2, New Obj 1, 2")},
  90. { SED_DESC_TYPE_CONT_AND_NEW_OBJECT, TEST_RESOURCE_PERM34, TEST_NEW_OBJ_SPECIAL_PERM34, SZ("Resource perms with 3, 4, New Obj 3, 4")},
  91. { SED_DESC_TYPE_CONT_AND_NEW_OBJECT, TEST_RESOURCE_PERM135, TEST_NEW_OBJ_SPECIAL_PERM12, SZ("Resource perms with 1, 3, 5, New Obj 1, 2")},
  92. { SED_DESC_TYPE_CONT_AND_NEW_OBJECT, TEST_RESOURCE_PERM4, TEST_NEW_OBJ_SPECIAL_PERM34, SZ("Resource perms with 4, New Obj 3, 4")},
  93. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM1, 0, SZ("Perm bit 1")},
  94. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM2, 0, SZ("Perm bit 2")},
  95. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM3, 0, SZ("Perm bit 3")},
  96. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM4, 0, SZ("Perm bit 4")},
  97. { SED_DESC_TYPE_RESOURCE_SPECIAL, TEST_SPECIAL_PERM5, 0, SZ("Perm bit 5")},
  98. { SED_DESC_TYPE_NEW_OBJECT_SPECIAL, TEST_NEW_OBJ_SPECIAL_PERM1, 0, SZ("New Obj Perm bit 1")},
  99. { SED_DESC_TYPE_NEW_OBJECT_SPECIAL, TEST_NEW_OBJ_SPECIAL_PERM2, 0, SZ("New Obj Perm bit 2")},
  100. { SED_DESC_TYPE_NEW_OBJECT_SPECIAL, TEST_NEW_OBJ_SPECIAL_PERM3, 0, SZ("New Obj Perm bit 3")},
  101. { SED_DESC_TYPE_NEW_OBJECT_SPECIAL, TEST_NEW_OBJ_SPECIAL_PERM4, 0, SZ("New Obj Perm bit 4")},
  102. { SED_DESC_TYPE_NEW_OBJECT_SPECIAL, TEST_NEW_OBJ_SPECIAL_PERM5, 0, SZ("New Obj Perm bit 5")}
  103. } ;
  104. SED_APPLICATION_ACCESS sedappaccessAuditting[] =
  105. { { SED_DESC_TYPE_AUDIT, TEST_RESOURCE_PERM12, 0, SZ("Resource Audits with 1, 2")},
  106. { SED_DESC_TYPE_AUDIT, TEST_RESOURCE_PERM34, 0, SZ("Resource Audits with 3, 4")},
  107. { SED_DESC_TYPE_AUDIT, TEST_RESOURCE_PERM135, 0, SZ("Resource Audits with 1, 3, 5")},
  108. } ;
  109. #define SIZEOF_NEWOBJ_ARRAY (sizeof(sedappaccessNewObj))
  110. #define SIZEOF_NO_NEWOBJ_ARRAY (sizeof(sedappaccessNoNewObj))
  111. #define SIZEOF_AUDIT_ARRAY (sizeof(sedappaccessAuditting))
  112. #define COUNT_NEWOBJ_ARRAY (sizeof(sedappaccessNewObj)/sizeof(SED_APPLICATION_ACCESS))
  113. #define COUNT_NO_NEWOBJ_ARRAY (sizeof(sedappaccessNoNewObj)/sizeof(SED_APPLICATION_ACCESS))
  114. #define COUNT_AUDIT_ARRAY (sizeof(sedappaccessAuditting)/sizeof(SED_APPLICATION_ACCESS))
  115. /* We need to build a dummy security descriptor that we can pass to the
  116. * API. The following was borrowed from Danl's radmin test stuff.
  117. */
  118. //
  119. // DataStructures
  120. //
  121. typedef struct _TEST_SID {
  122. UCHAR Revision;
  123. UCHAR SubAuthorityCount;
  124. UCHAR IdentifierAuthority[6];
  125. ULONG SubAuthority[10];
  126. } TEST_SID, *PTEST_SID, *LPTEST_SID;
  127. typedef struct _TEST_ACE {
  128. UCHAR AceType ;
  129. UCHAR AceSize ;
  130. UCHAR InheritFlags ;
  131. UCHAR AceFlags ;
  132. ACCESS_MASK Mask ;
  133. TEST_SID sid ;
  134. } TEST_ACE, *PTEST_ACE ;
  135. typedef struct _TEST_ACL {
  136. UCHAR AclRevision;
  137. UCHAR Sbz1;
  138. USHORT AclSize;
  139. USHORT AceCount;
  140. USHORT sbz2 ;
  141. TEST_ACE Ace1[3] ;
  142. //TEST_ACE Ace2 ;
  143. //TEST_ACE Ace3 ;
  144. } TEST_ACL, *PTEST_ACL;
  145. typedef struct _TEST_SECURITY_DESCRIPTOR {
  146. UCHAR Revision;
  147. UCHAR Sbz1;
  148. SECURITY_DESCRIPTOR_CONTROL Control;
  149. PTEST_SID Owner;
  150. PTEST_SID Group;
  151. PTEST_ACL Sacl;
  152. PTEST_ACL Dacl;
  153. } TEST_SECURITY_DESCRIPTOR, *PTEST_SECURITY_DESCRIPTOR;
  154. //
  155. // GLOBALS
  156. //
  157. TEST_SID OwnerSid = {
  158. 1, 5,
  159. 1,2,3,4,5,6,
  160. 0x999, 0x888, 0x777, 0x666, 0x12345678};
  161. TEST_SID GroupSid = {
  162. 1, 5,
  163. 1,2,3,4,5,6,
  164. 0x999, 0x888, 0x777, 0x666, 0x12345678};
  165. TEST_ACL SaclAcl = { 2, 0, sizeof(TEST_ACL)+1024, 1, 0,
  166. { SYSTEM_AUDIT_ACE_TYPE, sizeof(TEST_ACE),
  167. CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE, SUCCESSFUL_ACCESS_ACE_FLAG|FAILED_ACCESS_ACE_FLAG,
  168. TEST_RESOURCE_PERM12,
  169. { 1, 5,
  170. 1,2,3,4,5,6,
  171. 0x999, 0x888, 0x777, 0x666, 0x12345678
  172. }
  173. } } ;
  174. TCHAR _SaclAclBufferSpace[1024] ;
  175. TEST_ACL DaclAcl = { 2, 0, sizeof(TEST_ACL)+1024, 1, 0,
  176. { ACCESS_DENIED_ACE_TYPE, sizeof(TEST_ACE),
  177. CONTAINER_INHERIT_ACE, 0,
  178. GENERIC_ALL,
  179. { 1, 5,
  180. 1,2,3,4,5,6,
  181. 0x999, 0x888, 0x777, 0x666, 0x12345678
  182. }
  183. } } ;
  184. TCHAR _DaclAclBufferSpace[1024] ;
  185. TEST_ACL DaclAclNewObj = { 2, 0, sizeof(TEST_ACL)+1024, 1, 0,
  186. { ACCESS_DENIED_ACE_TYPE, sizeof(TEST_ACE),
  187. CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE, 0,
  188. GENERIC_ALL,
  189. { 1, 5,
  190. 1,2,3,4,5,6,
  191. 0x999, 0x888, 0x777, 0x666, 0x12345678
  192. }
  193. } } ;
  194. TCHAR _DaclAclNewObjBufferSpace[1024] ;
  195. TEST_ACE AuditAce1 =
  196. { SYSTEM_AUDIT_ACE_TYPE, sizeof(TEST_ACE),
  197. CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE, SUCCESSFUL_ACCESS_ACE_FLAG|FAILED_ACCESS_ACE_FLAG,
  198. TEST_RESOURCE_PERM135,
  199. { 1, 5,
  200. 1,1,3,4,5,6,
  201. 0x999, 0x888, 0x777, 0x666, 0x12345678
  202. }
  203. } ;
  204. TEST_ACE AccessAce1 =
  205. { ACCESS_DENIED_ACE_TYPE, sizeof(TEST_ACE),
  206. CONTAINER_INHERIT_ACE, 0,
  207. GENERIC_ALL,
  208. { 1, 5,
  209. 1,1,3,4,5,6,
  210. 0x999, 0x888, 0x777, 0x666, 0x12345678
  211. }
  212. } ;
  213. TEST_ACE AccessNewObjAce1 =
  214. { ACCESS_DENIED_ACE_TYPE, sizeof(TEST_ACE),
  215. CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE, 0,
  216. GENERIC_ALL,
  217. { 1, 5,
  218. 1,1,3,4,5,6,
  219. 0x999, 0x888, 0x777, 0x666, 0x12345678
  220. }
  221. } ;
  222. TEST_SECURITY_DESCRIPTOR TestSd = {
  223. 1, 2, SE_DACL_PRESENT|SE_SACL_PRESENT,
  224. &OwnerSid,
  225. &GroupSid,
  226. &SaclAcl,
  227. &DaclAcl };
  228. TEST_SECURITY_DESCRIPTOR TestSdNewObj = {
  229. 1, 2, SE_DACL_PRESENT|SE_SACL_PRESENT,
  230. &OwnerSid,
  231. &GroupSid,
  232. &SaclAcl,
  233. &DaclAclNewObj };
  234. /****************************************************************************
  235. FUNCTION: test4()
  236. PURPOSE: Test the generic ACL Editor, specifically the
  237. SedDiscretionaryAclEditor and the SedSystemAclEditor
  238. COMMENTS:
  239. ****************************************************************************/
  240. void test4(HWND hwndParent)
  241. {
  242. BOOL fIsContainer = FALSE,
  243. fSupportsNewObjects = FALSE,
  244. fDACLEditor = TRUE ;
  245. switch (MessageBox(hwndParent,SZ("Test the DACL editor (Yes) or the SACL editor (No)?"),
  246. SZ("Welcome to way cool test4 (AclEditor)"),MB_YESNOCANCEL))
  247. {
  248. case IDYES:
  249. break ;
  250. case IDNO:
  251. {
  252. fDACLEditor = FALSE ;
  253. BOOL fPresent ;
  254. OS_ACL * posSACL ;
  255. OS_ACE osAceSACL( (void *) &AuditAce1 ) ;
  256. UIASSERT( !osAceSACL.QueryError() ) ;
  257. OS_SECURITY_DESCRIPTOR ossecdescSACL( (PSECURITY_DESCRIPTOR)&TestSd ) ;
  258. UIASSERT( !ossecdescSACL.QueryError() ) ;
  259. REQUIRE( !ossecdescSACL.QuerySACL( &fPresent, &posSACL )) ;
  260. UIASSERT( fPresent ) ;
  261. REQUIRE( !posSACL->AddACE( 0, osAceSACL )) ;
  262. }
  263. break ;
  264. case IDCANCEL:
  265. default:
  266. return ;
  267. }
  268. if ( fDACLEditor )
  269. {
  270. switch (MessageBox(hwndParent,SZ("Test the container object code? "),
  271. SZ("Welcome to way cool test4 (SedDiscretionaryAclEditor)"),MB_YESNOCANCEL))
  272. {
  273. case IDYES:
  274. fIsContainer = TRUE ;
  275. break ;
  276. switch (MessageBox(hwndParent,SZ("Does the container support New Object creation? "),
  277. SZ("Welcome to way cool test4 (SedDiscretionaryAclEditor)"),MB_YESNOCANCEL))
  278. {
  279. case IDYES:
  280. {
  281. fSupportsNewObjects = TRUE ;
  282. BOOL fPresent ;
  283. OS_ACL * posDACL ;
  284. OS_ACE osAceDACL( (void *) &AccessNewObjAce1 ) ;
  285. UIASSERT( !osAceDACL.QueryError() ) ;
  286. OS_SECURITY_DESCRIPTOR ossecdescDACL( (PSECURITY_DESCRIPTOR)&TestSdNewObj ) ;
  287. UIASSERT( !ossecdescDACL.QueryError() ) ;
  288. REQUIRE( !ossecdescDACL.QueryDACL( &fPresent, &posDACL )) ;
  289. UIASSERT( fPresent ) ;
  290. REQUIRE( !posDACL->AddACE( 0, osAceDACL )) ;
  291. }
  292. break ;
  293. case IDNO:
  294. {
  295. BOOL fPresent ;
  296. OS_ACL * posDACL ;
  297. OS_ACE osAceDACL( (void *) &AccessAce1 ) ;
  298. UIASSERT( !osAceDACL.QueryError() ) ;
  299. OS_SECURITY_DESCRIPTOR ossecdescDACL( (PSECURITY_DESCRIPTOR)&TestSd ) ;
  300. UIASSERT( !ossecdescDACL.QueryError() ) ;
  301. REQUIRE( !ossecdescDACL.QueryDACL( &fPresent, &posDACL )) ;
  302. UIASSERT( fPresent ) ;
  303. REQUIRE( !posDACL->AddACE( 0, osAceDACL )) ;
  304. }
  305. break ;
  306. case IDCANCEL:
  307. default:
  308. return ;
  309. }
  310. break ;
  311. case IDNO:
  312. break ;
  313. case IDCANCEL:
  314. default:
  315. return ;
  316. }
  317. }
  318. SED_OBJECT_TYPE_DESCRIPTOR sedobjdesc ;
  319. GENERIC_MAPPING GenericMapping ;
  320. sedobjdesc.Revision = SED_REVISION1 ;
  321. sedobjdesc.IsContainer = fIsContainer ;
  322. sedobjdesc.AllowNewObjectPerms = fSupportsNewObjects ;
  323. sedobjdesc.ObjectTypeName = SZ("Test object type name") ;
  324. sedobjdesc.MapSpecificPermsToGeneric = FALSE ;
  325. sedobjdesc.GenericMapping = &GenericMapping ;
  326. sedobjdesc.HelpInfo = NULL ;
  327. sedobjdesc.ApplyToSubContainerTitle = SZ("Apply To Sub Container Title") ;
  328. sedobjdesc.SpecialObjectAccessTitle = SZ("Special Object Access Title...") ;
  329. sedobjdesc.SpecialNewObjectAccessTitle = SZ("Special NEW Object Access Title...") ;
  330. BUFFER buff( sizeof(SED_APPLICATION_ACCESSES) +
  331. fSupportsNewObjects ? SIZEOF_NEWOBJ_ARRAY : SIZEOF_NO_NEWOBJ_ARRAY) ;
  332. if ( buff.QueryError() )
  333. {
  334. MessageBox( hwndParent, SZ("Error occurred allocating buffer"),SZ("Exitting test"), MB_OK) ;
  335. return ;
  336. }
  337. PSED_APPLICATION_ACCESSES psedappaccesses = (PSED_APPLICATION_ACCESSES) buff.QueryPtr() ;
  338. psedappaccesses->Count = !fDACLEditor ? COUNT_AUDIT_ARRAY :
  339. fSupportsNewObjects ? COUNT_NEWOBJ_ARRAY : COUNT_NO_NEWOBJ_ARRAY ;
  340. //::memcpyf( psedappaccesses->AccessGroup,
  341. // !fDACLEditor ? sedappaccessAuditting :
  342. // fSupportsNewObjects ? sedappaccessNewObj : sedappaccessNoNewObj,
  343. // !fDACLEditor ? SIZEOF_AUDIT_ARRAY :
  344. // fSupportsNewObjects ? SIZEOF_NEWOBJ_ARRAY : SIZEOF_NO_NEWOBJ_ARRAY ) ;
  345. DWORD rc ;
  346. DWORD dwSEDReturnStatus ;
  347. if ( fDACLEditor )
  348. rc = SedDiscretionaryAclEditor( hwndParent,
  349. NULL, // Instance handle
  350. SZ("\\\\JOHNL0"),
  351. &sedobjdesc,
  352. psedappaccesses,
  353. SZ("Resource Name (i.e., C:\MyFile)"),
  354. (PSED_FUNC_APPLY_SEC_CALLBACK) SedCallback,
  355. (ULONG_PTR)CALLBACK_CONTEXT,
  356. (PSECURITY_DESCRIPTOR) fSupportsNewObjects ?
  357. &TestSdNewObj : &TestSd,
  358. FALSE,
  359. &dwSEDReturnStatus ) ;
  360. else
  361. rc = SedSystemAclEditor( hwndParent,
  362. NULL, // Instance handle
  363. SZ("\\\\JOHNL0"),
  364. &sedobjdesc,
  365. psedappaccesses,
  366. SZ("Resource Name (i.e., C:\MyFile)"),
  367. (PSED_FUNC_APPLY_SEC_CALLBACK) SedCallback,
  368. (ULONG_PTR)CALLBACK_CONTEXT,
  369. (PSECURITY_DESCRIPTOR) fSupportsNewObjects ?
  370. &TestSdNewObj : &TestSd,
  371. FALSE,
  372. &dwSEDReturnStatus ) ;
  373. if ( rc )
  374. {
  375. TCHAR achBuff[100] ;
  376. wsprintf( achBuff, "Error code %ld returned from ACL Editor", rc ) ;
  377. MessageBox( hwndParent, achBuff, SZ("Apptest4"), MB_OK ) ;
  378. }
  379. }
  380. DWORD SedCallback( ULONG_PTR ulCallbackContext,
  381. PSECURITY_DESCRIPTOR psecdesc,
  382. BOOLEAN fApplyToSubContainers,
  383. BOOLEAN fApplyToSubObjects,
  384. LPDWORD StatusReturn
  385. )
  386. {
  387. UIASSERT( ulCallbackContext == CALLBACK_CONTEXT ) ;
  388. OS_SECURITY_DESCRIPTOR ossecdesc( psecdesc ) ;
  389. APIERR err = ossecdesc.QueryError() ;
  390. BOOL fValid = ossecdesc.IsValid() ;
  391. TCHAR achBuff[200] ;
  392. wsprintf( achBuff, "ossecdesc.QueryError() = %d, fApplyToSubContainers = %d, fApplyToSubObjects = %d, security desc will be output to the debugger (if debug build)",
  393. err, fApplyToSubContainers, fApplyToSubObjects ) ;
  394. MessageBox( NULL, achBuff, SZ("SedCallback"), MB_OK ) ;
  395. #ifdef DEBUG
  396. ossecdesc.DbgPrint() ;
  397. #endif
  398. *StatusReturn = SED_STATUS_FAILED_TO_MODIFY ;
  399. return NERR_Success ;
  400. }