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.

1281 lines
33 KiB

  1. /*++
  2. Copyright (c) 1996 Microsoft Corporation
  3. Module Name:
  4. scemm.cpp
  5. Abstract:
  6. Shared memory management APIs
  7. Author:
  8. Jin Huang
  9. Revision History:
  10. jinhuang 23-Jan-1998 merged from multiple modules
  11. --*/
  12. #include "headers.h"
  13. #include "scesvc.h"
  14. PVOID
  15. MIDL_user_allocate (
  16. size_t NumBytes
  17. )
  18. /*++
  19. Routine Description:
  20. Allocates storage for RPC server transactions. The RPC stubs will
  21. either call MIDL_user_allocate when it needs to un-marshall data into a
  22. buffer that the user must free. RPC servers will use MIDL_user_allocate to
  23. allocate storage that the RPC server stub will free after marshalling
  24. the data.
  25. Arguments:
  26. NumBytes - The number of bytes to allocate.
  27. Return Value:
  28. none
  29. Note:
  30. --*/
  31. {
  32. PVOID Buffer = (PVOID) ScepAlloc(LMEM_FIXED,(DWORD)NumBytes);
  33. if (Buffer != NULL) {
  34. RtlZeroMemory( Buffer, NumBytes );
  35. }
  36. return( Buffer );
  37. }
  38. VOID
  39. MIDL_user_free (
  40. void *MemPointer
  41. )
  42. /*++
  43. Routine Description:
  44. Frees storage used in RPC transactions. The RPC client can call this
  45. function to free buffer space that was allocated by the RPC client
  46. stub when un-marshalling data that is to be returned to the client.
  47. The Client calls MIDL_user_free when it is finished with the data and
  48. desires to free up the storage.
  49. The RPC server stub calls MIDL_user_free when it has completed
  50. marshalling server data that is to be passed back to the client.
  51. Arguments:
  52. MemPointer - This points to the memory block that is to be released.
  53. Return Value:
  54. none.
  55. Note:
  56. --*/
  57. {
  58. ScepFree(MemPointer);
  59. }
  60. SCESTATUS
  61. ScepFreeNameList(
  62. IN PSCE_NAME_LIST pName
  63. )
  64. /* ++
  65. Routine Description:
  66. This routine frees memory associated with PSCE_NAME_LIST pName
  67. Arguments:
  68. pName - a NAME_LIST
  69. Return value:
  70. SCESTATUS_SUCCESS
  71. -- */
  72. {
  73. PSCE_NAME_LIST pCurName;
  74. PSCE_NAME_LIST pTempName;
  75. SCESTATUS rc=SCESTATUS_SUCCESS;
  76. if ( pName == NULL )
  77. return(rc);
  78. //
  79. // free the Name component first then free the node
  80. //
  81. pCurName = pName;
  82. while ( pCurName != NULL ) {
  83. if ( pCurName->Name != NULL )
  84. __try {
  85. ScepFree( pCurName->Name );
  86. } __except (EXCEPTION_EXECUTE_HANDLER) {
  87. rc = SCESTATUS_INVALID_PARAMETER;
  88. }
  89. pTempName = pCurName;
  90. pCurName = pCurName->Next;
  91. __try {
  92. ScepFree( pTempName );
  93. } __except (EXCEPTION_EXECUTE_HANDLER) {
  94. rc = SCESTATUS_INVALID_PARAMETER;
  95. }
  96. }
  97. return(rc);
  98. }
  99. HLOCAL
  100. ScepAlloc(
  101. IN UINT uFlags,
  102. IN UINT uBytes
  103. )
  104. /*
  105. memory allocation routine, which calls LocalAlloc.
  106. */
  107. {
  108. HLOCAL pTemp=NULL;
  109. pTemp = LocalAlloc(uFlags, uBytes);
  110. #ifdef SCE_DBG
  111. if ( pTemp != NULL ) {
  112. TotalBytes += uBytes;
  113. printf("Allocate %d bytes at 0x%x. Total bytes = %d\n", uBytes, pTemp, TotalBytes);
  114. }
  115. #endif
  116. return(pTemp);
  117. }
  118. VOID
  119. ScepFree(
  120. HLOCAL pToFree
  121. )
  122. /*
  123. memory free routine, which calls LocalFree.
  124. */
  125. { HLOCAL pTemp;
  126. if (pToFree != NULL) {
  127. pTemp = LocalFree( pToFree );
  128. #ifdef SCE_DBG
  129. if ( pTemp == NULL )
  130. printf("0x%x is freed\n", pToFree);
  131. else
  132. printf("Unable to free 0x%x. Error code=%d\n", pToFree, GetLastError());
  133. #endif
  134. }
  135. }
  136. SCESTATUS
  137. ScepFreeErrorLog(
  138. IN PSCE_ERROR_LOG_INFO Errlog
  139. )
  140. /* ++
  141. Routine Description:
  142. This routine frees memory associated with SCE_ERROR_LOG_INFO list
  143. Arguments
  144. Errlog - Head of the error log
  145. Return value:
  146. SCESTATUS
  147. -- */
  148. {
  149. PSCE_ERROR_LOG_INFO pErr;
  150. PSCE_ERROR_LOG_INFO pTemp;
  151. if ( Errlog != NULL ) {
  152. pErr = Errlog;
  153. while ( pErr != NULL ) {
  154. if ( pErr->buffer != NULL )
  155. ScepFree( pErr->buffer );
  156. pTemp = pErr;
  157. pErr = pErr->next;
  158. ScepFree( pTemp );
  159. }
  160. }
  161. return(SCESTATUS_SUCCESS);
  162. }
  163. SCESTATUS
  164. ScepFreeRegistryValues(
  165. IN PSCE_REGISTRY_VALUE_INFO *ppRegValues,
  166. IN DWORD Count
  167. )
  168. /*
  169. free memory allocated for the array of SCE_REGISTRY_VALUE_INFO
  170. */
  171. {
  172. if ( ppRegValues && *ppRegValues ) {
  173. for ( DWORD i=0; i<Count; i++ ) {
  174. //
  175. // free value name buffer within each element
  176. //
  177. if ( (*ppRegValues)[i].FullValueName ) {
  178. ScepFree((*ppRegValues)[i].FullValueName);
  179. }
  180. __try {
  181. if ( (*ppRegValues)[i].Value ) {
  182. //
  183. // this is a pointer of PWSTR
  184. //
  185. ScepFree((*ppRegValues)[i].Value);
  186. }
  187. } __except (EXCEPTION_EXECUTE_HANDLER) {
  188. }
  189. }
  190. //
  191. // free the array buffer
  192. //
  193. ScepFree(*ppRegValues);
  194. *ppRegValues = NULL;
  195. }
  196. return(SCESTATUS_SUCCESS);
  197. }
  198. SCESTATUS
  199. WINAPI
  200. SceFreeMemory(
  201. IN PVOID sceInfo,
  202. IN DWORD Category
  203. )
  204. /* ++
  205. Routine Description:
  206. This routine frees memory associated with SceInfo in the specified area.
  207. The Type field in SceInfo indicates the type of the structure.
  208. Arguments:
  209. SceInfo - The memory buffer to free. It could be type
  210. SCE_ENGINE_SCP
  211. SCE_ENGINE_SAP
  212. SCE_ENGINE_SMP
  213. SCE_STRUCT_PROFILE
  214. SCE_STRUCT_USER
  215. Area - The security area to free. This argument is only used for
  216. SCE_ENGINE_SCP, SCE_ENGINE_SAP, and SCE_ENGINE_SMP types.
  217. Return value:
  218. None
  219. -- */
  220. {
  221. SCETYPE sceType;
  222. AREA_INFORMATION Area;
  223. PSCE_PROFILE_INFO pProfileInfo=NULL;
  224. PSCE_USER_PROFILE pProfile;
  225. PSCE_LOGON_HOUR pTempLogon;
  226. PSCE_USER_SETTING pPerUser;
  227. PSCE_OBJECT_SECURITY pos;
  228. SCESTATUS rc=SCESTATUS_SUCCESS;
  229. if ( sceInfo == NULL )
  230. return(SCESTATUS_SUCCESS);
  231. if ( Category != AREA_ALL && Category >= 300 ) {
  232. //
  233. // memory associated with list
  234. //
  235. __try {
  236. switch ( Category ) {
  237. case SCE_STRUCT_NAME_LIST:
  238. ScepFreeNameList((PSCE_NAME_LIST)sceInfo);
  239. break;
  240. case SCE_STRUCT_NAME_STATUS_LIST:
  241. ScepFreeNameStatusList( (PSCE_NAME_STATUS_LIST)sceInfo );
  242. break;
  243. case SCE_STRUCT_PRIVILEGE_VALUE_LIST:
  244. ScepFreePrivilegeValueList( (PSCE_PRIVILEGE_VALUE_LIST)sceInfo );
  245. break;
  246. case SCE_STRUCT_PRIVILEGE:
  247. ScepFreePrivilege( (PSCE_PRIVILEGE_ASSIGNMENT)sceInfo );
  248. break;
  249. case SCE_STRUCT_GROUP:
  250. ScepFreeGroupMembership( (PSCE_GROUP_MEMBERSHIP)sceInfo );
  251. break;
  252. case SCE_STRUCT_OBJECT_LIST:
  253. ScepFreeObjectList( (PSCE_OBJECT_LIST)sceInfo );
  254. break;
  255. case SCE_STRUCT_OBJECT_CHILDREN:
  256. ScepFreeObjectChildren( (PSCE_OBJECT_CHILDREN)sceInfo );
  257. break;
  258. case SCE_STRUCT_OBJECT_SECURITY:
  259. pos = (PSCE_OBJECT_SECURITY)sceInfo;
  260. if ( pos ) {
  261. if ( pos->Name != NULL )
  262. ScepFree( pos->Name );
  263. if ( pos->pSecurityDescriptor != NULL )
  264. ScepFree(pos->pSecurityDescriptor);
  265. ScepFree( pos );
  266. }
  267. break;
  268. case SCE_STRUCT_OBJECT_ARRAY:
  269. ScepFreeObjectSecurity( (PSCE_OBJECT_ARRAY)sceInfo );
  270. break;
  271. case SCE_STRUCT_PROFILE:
  272. case SCE_STRUCT_USER:
  273. SceFreeMemory( sceInfo, 0 ); // type is embedded
  274. break;
  275. case SCE_STRUCT_ERROR_LOG_INFO:
  276. ScepFreeErrorLog( (PSCE_ERROR_LOG_INFO)sceInfo );
  277. break;
  278. case SCE_STRUCT_SERVICES:
  279. SceFreePSCE_SERVICES((PSCE_SERVICES)sceInfo);
  280. break;
  281. default:
  282. rc = SCESTATUS_INVALID_PARAMETER;
  283. }
  284. } __except (EXCEPTION_EXECUTE_HANDLER) {
  285. ASSERT(FALSE);
  286. rc = SCESTATUS_INVALID_PARAMETER;
  287. }
  288. } else {
  289. sceType = *((SCETYPE *)sceInfo);
  290. Area = (AREA_INFORMATION)Category;
  291. switch ( sceType ) {
  292. case SCE_ENGINE_SCP:
  293. case SCE_ENGINE_SAP:
  294. case SCE_ENGINE_SMP:
  295. case SCE_ENGINE_SCP_INTERNAL:
  296. case SCE_ENGINE_SMP_INTERNAL:
  297. case SCE_STRUCT_INF:
  298. pProfileInfo = (PSCE_PROFILE_INFO)sceInfo;
  299. #if 0
  300. if ( Area & AREA_DS_OBJECTS ) {
  301. //
  302. // free ds list
  303. //
  304. if ( sceType == SCE_STRUCT_INF ) {
  305. ScepFreeObjectSecurity(pProfileInfo->pDsObjects.pAllNodes);
  306. pProfileInfo->pDsObjects.pAllNodes = NULL;
  307. } else {
  308. ScepFreeObjectList(pProfileInfo->pDsObjects.pOneLevel);
  309. pProfileInfo->pDsObjects.pOneLevel = NULL;
  310. }
  311. }
  312. #endif
  313. if ( Area & AREA_FILE_SECURITY ) {
  314. //
  315. // free file list and auditing list
  316. //
  317. __try {
  318. if ( sceType == SCE_STRUCT_INF ) {
  319. ScepFreeObjectSecurity(pProfileInfo->pFiles.pAllNodes);
  320. pProfileInfo->pFiles.pAllNodes = NULL;
  321. } else {
  322. ScepFreeObjectList(pProfileInfo->pFiles.pOneLevel);
  323. pProfileInfo->pFiles.pOneLevel = NULL;
  324. }
  325. } __except (EXCEPTION_EXECUTE_HANDLER) {
  326. ASSERT(FALSE);
  327. rc = SCESTATUS_INVALID_PARAMETER;
  328. }
  329. }
  330. if ( Area & AREA_REGISTRY_SECURITY ) {
  331. //
  332. // free registry keys list and auditing list
  333. //
  334. __try {
  335. if ( sceType == SCE_STRUCT_INF ) {
  336. ScepFreeObjectSecurity(pProfileInfo->pRegistryKeys.pAllNodes);
  337. pProfileInfo->pRegistryKeys.pAllNodes = NULL;
  338. } else {
  339. ScepFreeObjectList(pProfileInfo->pRegistryKeys.pOneLevel);
  340. pProfileInfo->pRegistryKeys.pOneLevel = NULL;
  341. }
  342. } __except (EXCEPTION_EXECUTE_HANDLER) {
  343. ASSERT(FALSE);
  344. rc = SCESTATUS_INVALID_PARAMETER;
  345. }
  346. }
  347. if ( Area & AREA_GROUP_MEMBERSHIP ) {
  348. __try {
  349. ScepFreeGroupMembership(pProfileInfo->pGroupMembership);
  350. pProfileInfo->pGroupMembership = NULL;
  351. } __except (EXCEPTION_EXECUTE_HANDLER) {
  352. ASSERT(FALSE);
  353. rc = SCESTATUS_INVALID_PARAMETER;
  354. }
  355. }
  356. if ( Area & AREA_PRIVILEGES ) {
  357. __try {
  358. switch ( sceType ) {
  359. case SCE_ENGINE_SCP_INTERNAL:
  360. case SCE_ENGINE_SMP_INTERNAL:
  361. //
  362. // SCP type Privilege Rights
  363. //
  364. ScepFreePrivilegeValueList(pProfileInfo->OtherInfo.scp.u.pPrivilegeAssignedTo);
  365. pProfileInfo->OtherInfo.scp.u.pPrivilegeAssignedTo = NULL;
  366. break;
  367. case SCE_STRUCT_INF:
  368. ScepFreePrivilege(pProfileInfo->OtherInfo.scp.u.pInfPrivilegeAssignedTo);
  369. pProfileInfo->OtherInfo.scp.u.pInfPrivilegeAssignedTo = NULL;
  370. break;
  371. case SCE_ENGINE_SMP:
  372. case SCE_ENGINE_SCP:
  373. //
  374. // SMP type Privilege Rights
  375. //
  376. ScepFreePrivilege(pProfileInfo->OtherInfo.smp.pPrivilegeAssignedTo);
  377. pProfileInfo->OtherInfo.smp.pPrivilegeAssignedTo = NULL;
  378. break;
  379. default: // SAP
  380. ScepFreePrivilege(pProfileInfo->OtherInfo.sap.pPrivilegeAssignedTo);
  381. pProfileInfo->OtherInfo.sap.pPrivilegeAssignedTo=NULL;
  382. break;
  383. }
  384. } __except (EXCEPTION_EXECUTE_HANDLER) {
  385. ASSERT(FALSE);
  386. rc = SCESTATUS_INVALID_PARAMETER;
  387. }
  388. }
  389. if ( Area & AREA_USER_SETTINGS ) {
  390. __try {
  391. switch ( sceType ) {
  392. case SCE_ENGINE_SCP_INTERNAL:
  393. case SCE_ENGINE_SMP_INTERNAL:
  394. case SCE_STRUCT_INF:
  395. //
  396. // Account Profiles
  397. //
  398. ScepFreeNameList(pProfileInfo->OtherInfo.scp.pAccountProfiles);
  399. pProfileInfo->OtherInfo.scp.pAccountProfiles = NULL;
  400. break;
  401. case SCE_ENGINE_SAP:
  402. //
  403. // SAP type
  404. //
  405. ScepFreeNameList(pProfileInfo->OtherInfo.sap.pUserList);
  406. pProfileInfo->OtherInfo.sap.pUserList = NULL;
  407. break;
  408. default: // SMP or SCP
  409. ScepFreeNameList(pProfileInfo->OtherInfo.smp.pUserList);
  410. pProfileInfo->OtherInfo.smp.pUserList = NULL;
  411. break;
  412. }
  413. } __except (EXCEPTION_EXECUTE_HANDLER) {
  414. ASSERT(FALSE);
  415. rc = SCESTATUS_INVALID_PARAMETER;
  416. }
  417. }
  418. if ( Area & AREA_SECURITY_POLICY ) {
  419. __try {
  420. if (pProfileInfo->NewAdministratorName != NULL ) {
  421. ScepFree( pProfileInfo->NewAdministratorName );
  422. pProfileInfo->NewAdministratorName = NULL;
  423. }
  424. if (pProfileInfo->NewGuestName != NULL ) {
  425. ScepFree( pProfileInfo->NewGuestName );
  426. pProfileInfo->NewGuestName = NULL;
  427. }
  428. if ( pProfileInfo->pKerberosInfo ) {
  429. ScepFree(pProfileInfo->pKerberosInfo);
  430. pProfileInfo->pKerberosInfo = NULL;
  431. }
  432. if ( pProfileInfo->RegValueCount && pProfileInfo->aRegValues ) {
  433. ScepFreeRegistryValues(&pProfileInfo->aRegValues,
  434. pProfileInfo->RegValueCount);
  435. }
  436. pProfileInfo->RegValueCount = 0;
  437. pProfileInfo->aRegValues = NULL;
  438. ScepResetSecurityPolicyArea(pProfileInfo);
  439. } __except (EXCEPTION_EXECUTE_HANDLER) {
  440. ASSERT(FALSE);
  441. rc = SCESTATUS_INVALID_PARAMETER;
  442. }
  443. }
  444. if ( Area & AREA_SYSTEM_SERVICE ) {
  445. //
  446. // free service info
  447. //
  448. __try {
  449. if (NULL != pProfileInfo->pServices)
  450. SceFreePSCE_SERVICES(pProfileInfo->pServices);
  451. pProfileInfo->pServices = NULL;
  452. } __except (EXCEPTION_EXECUTE_HANDLER) {
  453. ASSERT(FALSE);
  454. rc = SCESTATUS_INVALID_PARAMETER;
  455. }
  456. }
  457. break;
  458. case SCE_STRUCT_PROFILE:
  459. pProfile = (PSCE_USER_PROFILE)sceInfo;
  460. if ( pProfile != NULL ) {
  461. __try {
  462. if (pProfile->UserProfile != NULL )
  463. ScepFree(pProfile->UserProfile);
  464. pProfile->UserProfile = NULL;
  465. if (pProfile->LogonScript != NULL )
  466. ScepFree(pProfile->LogonScript);
  467. pProfile->LogonScript = NULL;
  468. if (pProfile->HomeDir != NULL )
  469. ScepFree(pProfile->HomeDir);
  470. pProfile->HomeDir = NULL;
  471. //
  472. // Logon hours
  473. //
  474. while (pProfile->pLogonHours != NULL ) {
  475. pTempLogon = pProfile->pLogonHours;
  476. pProfile->pLogonHours = pProfile->pLogonHours->Next;
  477. ScepFree(pTempLogon);
  478. }
  479. pProfile->pLogonHours = NULL;
  480. //
  481. // free Workstation name list
  482. //
  483. if ( pProfile->pWorkstations.Buffer != NULL )
  484. ScepFree(pProfile->pWorkstations.Buffer);
  485. pProfile->pWorkstations.Buffer = NULL;
  486. pProfile->pWorkstations.MaximumLength = 0;
  487. pProfile->pWorkstations.Length = 0;
  488. //
  489. // free Groups name list
  490. //
  491. ScepFreeNameList(pProfile->pGroupsBelongsTo);
  492. pProfile->pGroupsBelongsTo = NULL;
  493. //
  494. // free AssignToUsers name list
  495. //
  496. ScepFreeNameList(pProfile->pAssignToUsers);
  497. pProfile->pAssignToUsers = NULL;
  498. //
  499. // free SDs
  500. //
  501. if (pProfile->pHomeDirSecurity != NULL )
  502. ScepFree(pProfile->pHomeDirSecurity);
  503. pProfile->pHomeDirSecurity = NULL;
  504. if (pProfile->pTempDirSecurity != NULL )
  505. ScepFree(pProfile->pTempDirSecurity);
  506. pProfile->pTempDirSecurity = NULL;
  507. ScepFree(pProfile);
  508. } __except (EXCEPTION_EXECUTE_HANDLER) {
  509. ASSERT(FALSE);
  510. rc = SCESTATUS_INVALID_PARAMETER;
  511. }
  512. }
  513. break;
  514. case SCE_STRUCT_USER:
  515. pPerUser = (PSCE_USER_SETTING)sceInfo;
  516. if ( pPerUser != NULL ) {
  517. __try {
  518. ScepFreeNameList( pPerUser->pGroupsBelongsTo);
  519. pPerUser->pGroupsBelongsTo = NULL;
  520. if (pPerUser->UserProfile != NULL)
  521. ScepFree(pPerUser->UserProfile);
  522. pPerUser->UserProfile = NULL;
  523. if (pPerUser->pProfileSecurity != NULL)
  524. ScepFree(pPerUser->pProfileSecurity);
  525. pPerUser->pProfileSecurity = NULL;
  526. if (pPerUser->LogonScript != NULL)
  527. ScepFree(pPerUser->LogonScript);
  528. pPerUser->LogonScript = NULL;
  529. if (pPerUser->pLogonScriptSecurity != NULL)
  530. ScepFree(pPerUser->pLogonScriptSecurity);
  531. pPerUser->pLogonScriptSecurity = NULL;
  532. if (pPerUser->HomeDir != NULL)
  533. ScepFree(pPerUser->HomeDir);
  534. pPerUser->HomeDir = NULL;
  535. if (pPerUser->pHomeDirSecurity != NULL)
  536. ScepFree(pPerUser->pHomeDirSecurity);
  537. pPerUser->pHomeDirSecurity = NULL;
  538. if (pPerUser->TempDir != NULL)
  539. ScepFree(pPerUser->TempDir);
  540. pPerUser->TempDir = NULL;
  541. if (pPerUser->pTempDirSecurity != NULL)
  542. ScepFree(pPerUser->pTempDirSecurity);
  543. pPerUser->pTempDirSecurity = NULL;
  544. while (pPerUser->pLogonHours != NULL ) {
  545. pTempLogon = pPerUser->pLogonHours;
  546. pPerUser->pLogonHours = pPerUser->pLogonHours->Next;
  547. ScepFree(pTempLogon);
  548. }
  549. pPerUser->pLogonHours = NULL;
  550. if ( pPerUser->pWorkstations.Buffer != NULL )
  551. ScepFree( pPerUser->pWorkstations.Buffer );
  552. pPerUser->pWorkstations.Buffer = NULL;
  553. pPerUser->pWorkstations.MaximumLength = 0;
  554. pPerUser->pWorkstations.Length = 0;
  555. ScepFreeNameStatusList(pPerUser->pPrivilegesHeld);
  556. pPerUser->pPrivilegesHeld = NULL;
  557. ScepFree(pPerUser);
  558. } __except (EXCEPTION_EXECUTE_HANDLER) {
  559. ASSERT(FALSE);
  560. rc = SCESTATUS_INVALID_PARAMETER;
  561. }
  562. }
  563. break;
  564. default:
  565. return(SCESTATUS_INVALID_PARAMETER);
  566. }
  567. }
  568. return(rc);
  569. }
  570. SCESTATUS
  571. ScepResetSecurityPolicyArea(
  572. IN PSCE_PROFILE_INFO pProfileInfo
  573. )
  574. {
  575. INT i;
  576. if ( pProfileInfo != NULL ) {
  577. pProfileInfo->MinimumPasswordAge = SCE_NO_VALUE;
  578. pProfileInfo->MaximumPasswordAge = SCE_NO_VALUE;
  579. pProfileInfo->MinimumPasswordLength = SCE_NO_VALUE;
  580. pProfileInfo->PasswordComplexity = SCE_NO_VALUE;
  581. pProfileInfo->PasswordHistorySize = SCE_NO_VALUE;
  582. pProfileInfo->LockoutBadCount = SCE_NO_VALUE;
  583. pProfileInfo->ResetLockoutCount = SCE_NO_VALUE;
  584. pProfileInfo->LockoutDuration = SCE_NO_VALUE;
  585. pProfileInfo->RequireLogonToChangePassword = SCE_NO_VALUE;
  586. pProfileInfo->ForceLogoffWhenHourExpire = SCE_NO_VALUE;
  587. pProfileInfo->SecureSystemPartition = SCE_NO_VALUE;
  588. pProfileInfo->ClearTextPassword = SCE_NO_VALUE;
  589. pProfileInfo->LSAAnonymousNameLookup = SCE_NO_VALUE;
  590. for ( i=0; i<3; i++ ) {
  591. pProfileInfo->MaximumLogSize[i] = SCE_NO_VALUE;
  592. pProfileInfo->AuditLogRetentionPeriod[i] = SCE_NO_VALUE;
  593. pProfileInfo->RetentionDays[i] = SCE_NO_VALUE;
  594. pProfileInfo->RestrictGuestAccess[i] = SCE_NO_VALUE;
  595. }
  596. pProfileInfo->AuditSystemEvents = SCE_NO_VALUE;
  597. pProfileInfo->AuditLogonEvents = SCE_NO_VALUE;
  598. pProfileInfo->AuditObjectAccess = SCE_NO_VALUE;
  599. pProfileInfo->AuditPrivilegeUse = SCE_NO_VALUE;
  600. pProfileInfo->AuditPolicyChange = SCE_NO_VALUE;
  601. pProfileInfo->AuditAccountManage = SCE_NO_VALUE;
  602. pProfileInfo->AuditProcessTracking = SCE_NO_VALUE;
  603. pProfileInfo->AuditDSAccess = SCE_NO_VALUE;
  604. pProfileInfo->AuditAccountLogon = SCE_NO_VALUE;
  605. pProfileInfo->CrashOnAuditFull = SCE_NO_VALUE;
  606. if ( pProfileInfo->pKerberosInfo ) {
  607. pProfileInfo->pKerberosInfo->MaxTicketAge = SCE_NO_VALUE;
  608. pProfileInfo->pKerberosInfo->MaxRenewAge = SCE_NO_VALUE;
  609. pProfileInfo->pKerberosInfo->MaxServiceAge = SCE_NO_VALUE;
  610. pProfileInfo->pKerberosInfo->MaxClockSkew = SCE_NO_VALUE;
  611. pProfileInfo->pKerberosInfo->TicketValidateClient = SCE_NO_VALUE;
  612. }
  613. if ( pProfileInfo->RegValueCount && pProfileInfo->aRegValues ) {
  614. ScepFreeRegistryValues(&pProfileInfo->aRegValues,
  615. pProfileInfo->RegValueCount);
  616. }
  617. pProfileInfo->RegValueCount = 0;
  618. pProfileInfo->aRegValues = NULL;
  619. pProfileInfo->EnableAdminAccount = SCE_NO_VALUE;
  620. pProfileInfo->EnableGuestAccount = SCE_NO_VALUE;
  621. return(SCESTATUS_SUCCESS);
  622. } else {
  623. return(SCESTATUS_INVALID_PARAMETER);
  624. }
  625. }
  626. SCESTATUS
  627. WINAPI
  628. SceFreeProfileMemory(
  629. PSCE_PROFILE_INFO pProfile
  630. )
  631. {
  632. if ( pProfile == NULL )
  633. return(SCESTATUS_SUCCESS);
  634. switch ( pProfile->Type ) {
  635. case SCE_ENGINE_SCP:
  636. case SCE_ENGINE_SAP:
  637. case SCE_ENGINE_SMP:
  638. case SCE_ENGINE_SCP_INTERNAL:
  639. case SCE_ENGINE_SMP_INTERNAL:
  640. case SCE_STRUCT_INF:
  641. SceFreeMemory((PVOID)pProfile, AREA_ALL);
  642. ScepFree(pProfile);
  643. break;
  644. default:
  645. return(SCESTATUS_INVALID_PARAMETER);
  646. }
  647. return(SCESTATUS_SUCCESS);
  648. }
  649. SCESTATUS
  650. ScepFreePrivilege(
  651. IN PSCE_PRIVILEGE_ASSIGNMENT pRights
  652. )
  653. {
  654. PSCE_PRIVILEGE_ASSIGNMENT pTempRight;
  655. while ( pRights != NULL ) {
  656. if ( pRights->Name != NULL )
  657. ScepFree(pRights->Name);
  658. ScepFreeNameList(pRights->AssignedTo);
  659. pTempRight = pRights;
  660. pRights = pRights->Next;
  661. ScepFree( pTempRight );
  662. }
  663. return(SCESTATUS_SUCCESS);
  664. }
  665. SCESTATUS
  666. ScepFreeObjectSecurity(
  667. IN PSCE_OBJECT_ARRAY pObject
  668. )
  669. /* ++
  670. Routine Description:
  671. This routine frees memory associated with ppObject.
  672. Arguments:
  673. ppObject - buffer for object security
  674. Return value:
  675. SCESTATUS_SUCCESS
  676. -- */
  677. {
  678. PSCE_OBJECT_SECURITY pCurObject;
  679. DWORD i;
  680. if ( pObject == NULL )
  681. return(SCESTATUS_SUCCESS);
  682. for ( i=0; i<pObject->Count; i++ ) {
  683. pCurObject = pObject->pObjectArray[i];
  684. if ( pCurObject != NULL ) {
  685. if ( pCurObject->Name != NULL )
  686. ScepFree( pCurObject->Name );
  687. if ( pCurObject->pSecurityDescriptor != NULL )
  688. ScepFree(pCurObject->pSecurityDescriptor);
  689. // if ( pCurObject->SDspec != NULL )
  690. // ScepFree( pCurObject->SDspec );
  691. ScepFree( pCurObject );
  692. }
  693. }
  694. ScepFree(pObject);
  695. return(SCESTATUS_SUCCESS);
  696. }
  697. VOID
  698. SceFreePSCE_SERVICES(
  699. IN PSCE_SERVICES pServiceList
  700. )
  701. /*
  702. Routine Description:
  703. Free memory allocated in PSCE_SERVICES structure
  704. Arguments:
  705. pServiceList - the list of services node
  706. Return Value:
  707. none
  708. */
  709. {
  710. PSCE_SERVICES pTemp=pServiceList, pTemp2;
  711. while ( pTemp != NULL ) {
  712. //
  713. // ServiceName
  714. //
  715. if ( NULL != pTemp->ServiceName ) {
  716. LocalFree(pTemp->ServiceName);
  717. }
  718. //
  719. // display name
  720. //
  721. if ( NULL != pTemp->DisplayName ) {
  722. LocalFree(pTemp->DisplayName);
  723. }
  724. //
  725. // pSecurityDescriptor or ServiceEngineName
  726. // in same address
  727. //
  728. if ( NULL != pTemp->General.pSecurityDescriptor ) {
  729. LocalFree(pTemp->General.pSecurityDescriptor);
  730. }
  731. pTemp2 = pTemp;
  732. pTemp = pTemp->Next;
  733. // free the service node
  734. LocalFree(pTemp2);
  735. }
  736. return;
  737. }
  738. SCESTATUS
  739. ScepFreePrivilegeValueList(
  740. IN PSCE_PRIVILEGE_VALUE_LIST pPrivValueList
  741. )
  742. /* ++
  743. Routine Description:
  744. This routine frees memory associated with PSCE_PRIVILEGE_VALUE_LIST list
  745. Arguments:
  746. pPrivValueList - a PRIVILEGE_VALUE_LIST
  747. Return value:
  748. SCESTATUS_SUCCESS
  749. -- */
  750. {
  751. PSCE_PRIVILEGE_VALUE_LIST pCurName;
  752. PSCE_PRIVILEGE_VALUE_LIST pTempName;
  753. SCESTATUS rc=SCESTATUS_SUCCESS;
  754. if ( pPrivValueList == NULL )
  755. return(rc);
  756. pCurName = pPrivValueList;
  757. while ( pCurName != NULL ) {
  758. if ( pCurName->Name != NULL )
  759. __try {
  760. ScepFree( pCurName->Name );
  761. } __except (EXCEPTION_EXECUTE_HANDLER) {
  762. ASSERT(FALSE);
  763. rc = SCESTATUS_INVALID_PARAMETER;
  764. }
  765. pTempName = pCurName;
  766. pCurName = pCurName->Next;
  767. __try {
  768. ScepFree( pTempName );
  769. } __except (EXCEPTION_EXECUTE_HANDLER) {
  770. ASSERT(FALSE);
  771. rc = SCESTATUS_INVALID_PARAMETER;
  772. }
  773. }
  774. return(rc);
  775. }
  776. SCESTATUS
  777. ScepFreeNameStatusList(
  778. IN PSCE_NAME_STATUS_LIST pNameList
  779. )
  780. /* ++
  781. Routine Description:
  782. This routine frees memory associated with PSCE_NAME_STATUS_LIST pNameList
  783. Arguments:
  784. pNameList - a NAME_STATUS_LIST
  785. Return value:
  786. SCESTATUS_SUCCESS
  787. -- */
  788. {
  789. PSCE_NAME_STATUS_LIST pCurName;
  790. PSCE_NAME_STATUS_LIST pTempName;
  791. SCESTATUS rc=SCESTATUS_SUCCESS;
  792. if ( pNameList == NULL )
  793. return(rc);
  794. pCurName = pNameList;
  795. while ( pCurName != NULL ) {
  796. if ( pCurName->Name != NULL ){
  797. __try {
  798. ScepFree( pCurName->Name );
  799. } __except (EXCEPTION_EXECUTE_HANDLER) {
  800. ASSERT(FALSE);
  801. rc = SCESTATUS_INVALID_PARAMETER;
  802. }
  803. }
  804. pTempName = pCurName;
  805. pCurName = pCurName->Next;
  806. __try {
  807. ScepFree( pTempName );
  808. } __except (EXCEPTION_EXECUTE_HANDLER) {
  809. ASSERT(FALSE);
  810. rc = SCESTATUS_INVALID_PARAMETER;
  811. }
  812. }
  813. return(rc);
  814. }
  815. SCESTATUS
  816. ScepFreeGroupMembership(
  817. IN PSCE_GROUP_MEMBERSHIP pGroup
  818. )
  819. {
  820. PSCE_GROUP_MEMBERSHIP pTempGroup;
  821. while ( pGroup != NULL ) {
  822. if (pGroup->GroupName != NULL)
  823. ScepFree(pGroup->GroupName);
  824. //
  825. // free group members name list
  826. //
  827. ScepFreeNameList(pGroup->pMembers);
  828. ScepFreeNameList(pGroup->pMemberOf);
  829. ScepFreeNameStatusList(pGroup->pPrivilegesHeld);
  830. pTempGroup = pGroup;
  831. pGroup = pGroup->Next;
  832. ScepFree( pTempGroup );
  833. }
  834. return(SCESTATUS_SUCCESS);
  835. }
  836. SCESTATUS
  837. ScepFreeObjectList(
  838. IN PSCE_OBJECT_LIST pNameList
  839. )
  840. /* ++
  841. Routine Description:
  842. This routine frees memory associated with PSCE_OBJECT_LIST pNameList
  843. Arguments:
  844. pNameList - a OBJEcT_LIST
  845. Return value:
  846. SCESTATUS_SUCCESS
  847. -- */
  848. {
  849. PSCE_OBJECT_LIST pCurName;
  850. PSCE_OBJECT_LIST pTempName;
  851. SCESTATUS rc=SCESTATUS_SUCCESS;
  852. if ( pNameList == NULL )
  853. return(rc);
  854. pCurName = pNameList;
  855. while ( pCurName != NULL ) {
  856. if ( pCurName->Name != NULL )
  857. __try {
  858. ScepFree( pCurName->Name );
  859. } __except (EXCEPTION_EXECUTE_HANDLER) {
  860. ASSERT(FALSE);
  861. rc = SCESTATUS_INVALID_PARAMETER;
  862. }
  863. pTempName = pCurName;
  864. pCurName = pCurName->Next;
  865. __try {
  866. ScepFree( pTempName );
  867. } __except (EXCEPTION_EXECUTE_HANDLER) {
  868. ASSERT(FALSE);
  869. rc = SCESTATUS_INVALID_PARAMETER;
  870. }
  871. }
  872. return(rc);
  873. }
  874. SCESTATUS
  875. ScepFreeObjectChildren(
  876. IN PSCE_OBJECT_CHILDREN pNameArray
  877. )
  878. /* ++
  879. Routine Description:
  880. This routine frees memory associated with PSCE_OBJECT_LIST pNameList
  881. Arguments:
  882. pNameList - a OBJEcT_LIST
  883. Return value:
  884. SCESTATUS_SUCCESS
  885. -- */
  886. {
  887. SCESTATUS rc=SCESTATUS_SUCCESS;
  888. if ( pNameArray == NULL )
  889. return(rc);
  890. rc = ScepFreeObjectChildrenNode(pNameArray->nCount,
  891. &(pNameArray->arrObject));
  892. ScepFree(pNameArray);
  893. return(rc);
  894. }
  895. SCESTATUS
  896. ScepFreeObjectChildrenNode(
  897. IN DWORD Count,
  898. IN PSCE_OBJECT_CHILDREN_NODE *pArrObject
  899. )
  900. {
  901. SCESTATUS rc=SCESTATUS_SUCCESS;
  902. if ( NULL == pArrObject ) {
  903. return(rc);
  904. }
  905. DWORD i;
  906. for ( i=0; i<Count;i++) {
  907. if ( pArrObject[i] ) {
  908. if ( pArrObject[i]->Name ) {
  909. ScepFree( pArrObject[i]->Name );
  910. }
  911. ScepFree(pArrObject[i]);
  912. }
  913. }
  914. return(rc);
  915. }
  916. SCESTATUS
  917. SceSvcpFreeMemory(
  918. IN PVOID pvServiceInfo
  919. )
  920. {
  921. //
  922. // since PSCESVC_CONFIGURATION_INFO and PSCESVC_ANALYSIS_INFO contains
  923. // the same bytes, we just cast ServiceInfo to one type and free it.
  924. //
  925. if ( pvServiceInfo != NULL ) {
  926. __try {
  927. for ( DWORD i=0; i<*((DWORD *)pvServiceInfo); i++ ) {
  928. if ( ((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Key ) {
  929. ScepFree(((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Key);
  930. }
  931. if ( ((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Value ) {
  932. ScepFree(((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Value);
  933. }
  934. }
  935. ScepFree(((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines);
  936. ScepFree(pvServiceInfo);
  937. } __except(EXCEPTION_EXECUTE_HANDLER) {
  938. ASSERT(FALSE);
  939. return(SCESTATUS_INVALID_PARAMETER);
  940. }
  941. }
  942. return(SCESTATUS_SUCCESS);
  943. }