/*++ Copyright (c) 1996 Microsoft Corporation Module Name: scemm.cpp Abstract: Shared memory management APIs Author: Jin Huang Revision History: jinhuang 23-Jan-1998 merged from multiple modules --*/ #include "headers.h" #include "scesvc.h" PVOID MIDL_user_allocate ( size_t NumBytes ) /*++ Routine Description: Allocates storage for RPC server transactions. The RPC stubs will either call MIDL_user_allocate when it needs to un-marshall data into a buffer that the user must free. RPC servers will use MIDL_user_allocate to allocate storage that the RPC server stub will free after marshalling the data. Arguments: NumBytes - The number of bytes to allocate. Return Value: none Note: --*/ { PVOID Buffer = (PVOID) ScepAlloc(LMEM_FIXED,(DWORD)NumBytes); if (Buffer != NULL) { RtlZeroMemory( Buffer, NumBytes ); } return( Buffer ); } VOID MIDL_user_free ( void *MemPointer ) /*++ Routine Description: Frees storage used in RPC transactions. The RPC client can call this function to free buffer space that was allocated by the RPC client stub when un-marshalling data that is to be returned to the client. The Client calls MIDL_user_free when it is finished with the data and desires to free up the storage. The RPC server stub calls MIDL_user_free when it has completed marshalling server data that is to be passed back to the client. Arguments: MemPointer - This points to the memory block that is to be released. Return Value: none. Note: --*/ { ScepFree(MemPointer); } SCESTATUS ScepFreeNameList( IN PSCE_NAME_LIST pName ) /* ++ Routine Description: This routine frees memory associated with PSCE_NAME_LIST pName Arguments: pName - a NAME_LIST Return value: SCESTATUS_SUCCESS -- */ { PSCE_NAME_LIST pCurName; PSCE_NAME_LIST pTempName; SCESTATUS rc=SCESTATUS_SUCCESS; if ( pName == NULL ) return(rc); // // free the Name component first then free the node // pCurName = pName; while ( pCurName != NULL ) { if ( pCurName->Name != NULL ) __try { ScepFree( pCurName->Name ); } __except (EXCEPTION_EXECUTE_HANDLER) { rc = SCESTATUS_INVALID_PARAMETER; } pTempName = pCurName; pCurName = pCurName->Next; __try { ScepFree( pTempName ); } __except (EXCEPTION_EXECUTE_HANDLER) { rc = SCESTATUS_INVALID_PARAMETER; } } return(rc); } HLOCAL ScepAlloc( IN UINT uFlags, IN UINT uBytes ) /* memory allocation routine, which calls LocalAlloc. */ { HLOCAL pTemp=NULL; pTemp = LocalAlloc(uFlags, uBytes); #ifdef SCE_DBG if ( pTemp != NULL ) { TotalBytes += uBytes; printf("Allocate %d bytes at 0x%x. Total bytes = %d\n", uBytes, pTemp, TotalBytes); } #endif return(pTemp); } VOID ScepFree( HLOCAL pToFree ) /* memory free routine, which calls LocalFree. */ { HLOCAL pTemp; if (pToFree != NULL) { pTemp = LocalFree( pToFree ); #ifdef SCE_DBG if ( pTemp == NULL ) printf("0x%x is freed\n", pToFree); else printf("Unable to free 0x%x. Error code=%d\n", pToFree, GetLastError()); #endif } } SCESTATUS ScepFreeErrorLog( IN PSCE_ERROR_LOG_INFO Errlog ) /* ++ Routine Description: This routine frees memory associated with SCE_ERROR_LOG_INFO list Arguments Errlog - Head of the error log Return value: SCESTATUS -- */ { PSCE_ERROR_LOG_INFO pErr; PSCE_ERROR_LOG_INFO pTemp; if ( Errlog != NULL ) { pErr = Errlog; while ( pErr != NULL ) { if ( pErr->buffer != NULL ) ScepFree( pErr->buffer ); pTemp = pErr; pErr = pErr->next; ScepFree( pTemp ); } } return(SCESTATUS_SUCCESS); } SCESTATUS ScepFreeRegistryValues( IN PSCE_REGISTRY_VALUE_INFO *ppRegValues, IN DWORD Count ) /* free memory allocated for the array of SCE_REGISTRY_VALUE_INFO */ { if ( ppRegValues && *ppRegValues ) { for ( DWORD i=0; i= 300 ) { // // memory associated with list // __try { switch ( Category ) { case SCE_STRUCT_NAME_LIST: ScepFreeNameList((PSCE_NAME_LIST)sceInfo); break; case SCE_STRUCT_NAME_STATUS_LIST: ScepFreeNameStatusList( (PSCE_NAME_STATUS_LIST)sceInfo ); break; case SCE_STRUCT_PRIVILEGE_VALUE_LIST: ScepFreePrivilegeValueList( (PSCE_PRIVILEGE_VALUE_LIST)sceInfo ); break; case SCE_STRUCT_PRIVILEGE: ScepFreePrivilege( (PSCE_PRIVILEGE_ASSIGNMENT)sceInfo ); break; case SCE_STRUCT_GROUP: ScepFreeGroupMembership( (PSCE_GROUP_MEMBERSHIP)sceInfo ); break; case SCE_STRUCT_OBJECT_LIST: ScepFreeObjectList( (PSCE_OBJECT_LIST)sceInfo ); break; case SCE_STRUCT_OBJECT_CHILDREN: ScepFreeObjectChildren( (PSCE_OBJECT_CHILDREN)sceInfo ); break; case SCE_STRUCT_OBJECT_SECURITY: pos = (PSCE_OBJECT_SECURITY)sceInfo; if ( pos ) { if ( pos->Name != NULL ) ScepFree( pos->Name ); if ( pos->pSecurityDescriptor != NULL ) ScepFree(pos->pSecurityDescriptor); ScepFree( pos ); } break; case SCE_STRUCT_OBJECT_ARRAY: ScepFreeObjectSecurity( (PSCE_OBJECT_ARRAY)sceInfo ); break; case SCE_STRUCT_PROFILE: case SCE_STRUCT_USER: SceFreeMemory( sceInfo, 0 ); // type is embedded break; case SCE_STRUCT_ERROR_LOG_INFO: ScepFreeErrorLog( (PSCE_ERROR_LOG_INFO)sceInfo ); break; case SCE_STRUCT_SERVICES: SceFreePSCE_SERVICES((PSCE_SERVICES)sceInfo); break; default: rc = SCESTATUS_INVALID_PARAMETER; } } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } else { sceType = *((SCETYPE *)sceInfo); Area = (AREA_INFORMATION)Category; switch ( sceType ) { case SCE_ENGINE_SCP: case SCE_ENGINE_SAP: case SCE_ENGINE_SMP: case SCE_ENGINE_SCP_INTERNAL: case SCE_ENGINE_SMP_INTERNAL: case SCE_STRUCT_INF: pProfileInfo = (PSCE_PROFILE_INFO)sceInfo; #if 0 if ( Area & AREA_DS_OBJECTS ) { // // free ds list // if ( sceType == SCE_STRUCT_INF ) { ScepFreeObjectSecurity(pProfileInfo->pDsObjects.pAllNodes); pProfileInfo->pDsObjects.pAllNodes = NULL; } else { ScepFreeObjectList(pProfileInfo->pDsObjects.pOneLevel); pProfileInfo->pDsObjects.pOneLevel = NULL; } } #endif if ( Area & AREA_FILE_SECURITY ) { // // free file list and auditing list // __try { if ( sceType == SCE_STRUCT_INF ) { ScepFreeObjectSecurity(pProfileInfo->pFiles.pAllNodes); pProfileInfo->pFiles.pAllNodes = NULL; } else { ScepFreeObjectList(pProfileInfo->pFiles.pOneLevel); pProfileInfo->pFiles.pOneLevel = NULL; } } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } if ( Area & AREA_REGISTRY_SECURITY ) { // // free registry keys list and auditing list // __try { if ( sceType == SCE_STRUCT_INF ) { ScepFreeObjectSecurity(pProfileInfo->pRegistryKeys.pAllNodes); pProfileInfo->pRegistryKeys.pAllNodes = NULL; } else { ScepFreeObjectList(pProfileInfo->pRegistryKeys.pOneLevel); pProfileInfo->pRegistryKeys.pOneLevel = NULL; } } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } if ( Area & AREA_GROUP_MEMBERSHIP ) { __try { ScepFreeGroupMembership(pProfileInfo->pGroupMembership); pProfileInfo->pGroupMembership = NULL; } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } if ( Area & AREA_PRIVILEGES ) { __try { switch ( sceType ) { case SCE_ENGINE_SCP_INTERNAL: case SCE_ENGINE_SMP_INTERNAL: // // SCP type Privilege Rights // ScepFreePrivilegeValueList(pProfileInfo->OtherInfo.scp.u.pPrivilegeAssignedTo); pProfileInfo->OtherInfo.scp.u.pPrivilegeAssignedTo = NULL; break; case SCE_STRUCT_INF: ScepFreePrivilege(pProfileInfo->OtherInfo.scp.u.pInfPrivilegeAssignedTo); pProfileInfo->OtherInfo.scp.u.pInfPrivilegeAssignedTo = NULL; break; case SCE_ENGINE_SMP: case SCE_ENGINE_SCP: // // SMP type Privilege Rights // ScepFreePrivilege(pProfileInfo->OtherInfo.smp.pPrivilegeAssignedTo); pProfileInfo->OtherInfo.smp.pPrivilegeAssignedTo = NULL; break; default: // SAP ScepFreePrivilege(pProfileInfo->OtherInfo.sap.pPrivilegeAssignedTo); pProfileInfo->OtherInfo.sap.pPrivilegeAssignedTo=NULL; break; } } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } if ( Area & AREA_USER_SETTINGS ) { __try { switch ( sceType ) { case SCE_ENGINE_SCP_INTERNAL: case SCE_ENGINE_SMP_INTERNAL: case SCE_STRUCT_INF: // // Account Profiles // ScepFreeNameList(pProfileInfo->OtherInfo.scp.pAccountProfiles); pProfileInfo->OtherInfo.scp.pAccountProfiles = NULL; break; case SCE_ENGINE_SAP: // // SAP type // ScepFreeNameList(pProfileInfo->OtherInfo.sap.pUserList); pProfileInfo->OtherInfo.sap.pUserList = NULL; break; default: // SMP or SCP ScepFreeNameList(pProfileInfo->OtherInfo.smp.pUserList); pProfileInfo->OtherInfo.smp.pUserList = NULL; break; } } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } if ( Area & AREA_SECURITY_POLICY ) { __try { if (pProfileInfo->NewAdministratorName != NULL ) { ScepFree( pProfileInfo->NewAdministratorName ); pProfileInfo->NewAdministratorName = NULL; } if (pProfileInfo->NewGuestName != NULL ) { ScepFree( pProfileInfo->NewGuestName ); pProfileInfo->NewGuestName = NULL; } if ( pProfileInfo->pKerberosInfo ) { ScepFree(pProfileInfo->pKerberosInfo); pProfileInfo->pKerberosInfo = NULL; } if ( pProfileInfo->RegValueCount && pProfileInfo->aRegValues ) { ScepFreeRegistryValues(&pProfileInfo->aRegValues, pProfileInfo->RegValueCount); } pProfileInfo->RegValueCount = 0; pProfileInfo->aRegValues = NULL; ScepResetSecurityPolicyArea(pProfileInfo); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } break; case SCE_STRUCT_PROFILE: pProfile = (PSCE_USER_PROFILE)sceInfo; if ( pProfile != NULL ) { __try { if (pProfile->UserProfile != NULL ) ScepFree(pProfile->UserProfile); pProfile->UserProfile = NULL; if (pProfile->LogonScript != NULL ) ScepFree(pProfile->LogonScript); pProfile->LogonScript = NULL; if (pProfile->HomeDir != NULL ) ScepFree(pProfile->HomeDir); pProfile->HomeDir = NULL; // // Logon hours // while (pProfile->pLogonHours != NULL ) { pTempLogon = pProfile->pLogonHours; pProfile->pLogonHours = pProfile->pLogonHours->Next; ScepFree(pTempLogon); } pProfile->pLogonHours = NULL; // // free Workstation name list // if ( pProfile->pWorkstations.Buffer != NULL ) ScepFree(pProfile->pWorkstations.Buffer); pProfile->pWorkstations.Buffer = NULL; pProfile->pWorkstations.MaximumLength = 0; pProfile->pWorkstations.Length = 0; // // free Groups name list // ScepFreeNameList(pProfile->pGroupsBelongsTo); pProfile->pGroupsBelongsTo = NULL; // // free AssignToUsers name list // ScepFreeNameList(pProfile->pAssignToUsers); pProfile->pAssignToUsers = NULL; // // free SDs // if (pProfile->pHomeDirSecurity != NULL ) ScepFree(pProfile->pHomeDirSecurity); pProfile->pHomeDirSecurity = NULL; if (pProfile->pTempDirSecurity != NULL ) ScepFree(pProfile->pTempDirSecurity); pProfile->pTempDirSecurity = NULL; ScepFree(pProfile); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } break; case SCE_STRUCT_USER: pPerUser = (PSCE_USER_SETTING)sceInfo; if ( pPerUser != NULL ) { __try { ScepFreeNameList( pPerUser->pGroupsBelongsTo); pPerUser->pGroupsBelongsTo = NULL; if (pPerUser->UserProfile != NULL) ScepFree(pPerUser->UserProfile); pPerUser->UserProfile = NULL; if (pPerUser->pProfileSecurity != NULL) ScepFree(pPerUser->pProfileSecurity); pPerUser->pProfileSecurity = NULL; if (pPerUser->LogonScript != NULL) ScepFree(pPerUser->LogonScript); pPerUser->LogonScript = NULL; if (pPerUser->pLogonScriptSecurity != NULL) ScepFree(pPerUser->pLogonScriptSecurity); pPerUser->pLogonScriptSecurity = NULL; if (pPerUser->HomeDir != NULL) ScepFree(pPerUser->HomeDir); pPerUser->HomeDir = NULL; if (pPerUser->pHomeDirSecurity != NULL) ScepFree(pPerUser->pHomeDirSecurity); pPerUser->pHomeDirSecurity = NULL; if (pPerUser->TempDir != NULL) ScepFree(pPerUser->TempDir); pPerUser->TempDir = NULL; if (pPerUser->pTempDirSecurity != NULL) ScepFree(pPerUser->pTempDirSecurity); pPerUser->pTempDirSecurity = NULL; while (pPerUser->pLogonHours != NULL ) { pTempLogon = pPerUser->pLogonHours; pPerUser->pLogonHours = pPerUser->pLogonHours->Next; ScepFree(pTempLogon); } pPerUser->pLogonHours = NULL; if ( pPerUser->pWorkstations.Buffer != NULL ) ScepFree( pPerUser->pWorkstations.Buffer ); pPerUser->pWorkstations.Buffer = NULL; pPerUser->pWorkstations.MaximumLength = 0; pPerUser->pWorkstations.Length = 0; ScepFreeNameStatusList(pPerUser->pPrivilegesHeld); pPerUser->pPrivilegesHeld = NULL; ScepFree(pPerUser); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } break; default: return(SCESTATUS_INVALID_PARAMETER); } } return(rc); } SCESTATUS ScepResetSecurityPolicyArea( IN PSCE_PROFILE_INFO pProfileInfo ) { INT i; if ( pProfileInfo != NULL ) { pProfileInfo->MinimumPasswordAge = SCE_NO_VALUE; pProfileInfo->MaximumPasswordAge = SCE_NO_VALUE; pProfileInfo->MinimumPasswordLength = SCE_NO_VALUE; pProfileInfo->PasswordComplexity = SCE_NO_VALUE; pProfileInfo->PasswordHistorySize = SCE_NO_VALUE; pProfileInfo->LockoutBadCount = SCE_NO_VALUE; pProfileInfo->ResetLockoutCount = SCE_NO_VALUE; pProfileInfo->LockoutDuration = SCE_NO_VALUE; pProfileInfo->RequireLogonToChangePassword = SCE_NO_VALUE; pProfileInfo->ForceLogoffWhenHourExpire = SCE_NO_VALUE; pProfileInfo->SecureSystemPartition = SCE_NO_VALUE; pProfileInfo->ClearTextPassword = SCE_NO_VALUE; pProfileInfo->LSAAnonymousNameLookup = SCE_NO_VALUE; for ( i=0; i<3; i++ ) { pProfileInfo->MaximumLogSize[i] = SCE_NO_VALUE; pProfileInfo->AuditLogRetentionPeriod[i] = SCE_NO_VALUE; pProfileInfo->RetentionDays[i] = SCE_NO_VALUE; pProfileInfo->RestrictGuestAccess[i] = SCE_NO_VALUE; } pProfileInfo->AuditSystemEvents = SCE_NO_VALUE; pProfileInfo->AuditLogonEvents = SCE_NO_VALUE; pProfileInfo->AuditObjectAccess = SCE_NO_VALUE; pProfileInfo->AuditPrivilegeUse = SCE_NO_VALUE; pProfileInfo->AuditPolicyChange = SCE_NO_VALUE; pProfileInfo->AuditAccountManage = SCE_NO_VALUE; pProfileInfo->AuditProcessTracking = SCE_NO_VALUE; pProfileInfo->AuditDSAccess = SCE_NO_VALUE; pProfileInfo->AuditAccountLogon = SCE_NO_VALUE; pProfileInfo->CrashOnAuditFull = SCE_NO_VALUE; if ( pProfileInfo->pKerberosInfo ) { pProfileInfo->pKerberosInfo->MaxTicketAge = SCE_NO_VALUE; pProfileInfo->pKerberosInfo->MaxRenewAge = SCE_NO_VALUE; pProfileInfo->pKerberosInfo->MaxServiceAge = SCE_NO_VALUE; pProfileInfo->pKerberosInfo->MaxClockSkew = SCE_NO_VALUE; pProfileInfo->pKerberosInfo->TicketValidateClient = SCE_NO_VALUE; } if ( pProfileInfo->RegValueCount && pProfileInfo->aRegValues ) { ScepFreeRegistryValues(&pProfileInfo->aRegValues, pProfileInfo->RegValueCount); } pProfileInfo->RegValueCount = 0; pProfileInfo->aRegValues = NULL; pProfileInfo->EnableAdminAccount = SCE_NO_VALUE; pProfileInfo->EnableGuestAccount = SCE_NO_VALUE; return(SCESTATUS_SUCCESS); } else { return(SCESTATUS_INVALID_PARAMETER); } } SCESTATUS WINAPI SceFreeProfileMemory( PSCE_PROFILE_INFO pProfile ) { if ( pProfile == NULL ) return(SCESTATUS_SUCCESS); switch ( pProfile->Type ) { case SCE_ENGINE_SCP: case SCE_ENGINE_SAP: case SCE_ENGINE_SMP: case SCE_ENGINE_SCP_INTERNAL: case SCE_ENGINE_SMP_INTERNAL: case SCE_STRUCT_INF: SceFreeMemory((PVOID)pProfile, AREA_ALL); ScepFree(pProfile); break; default: return(SCESTATUS_INVALID_PARAMETER); } return(SCESTATUS_SUCCESS); } SCESTATUS ScepFreePrivilege( IN PSCE_PRIVILEGE_ASSIGNMENT pRights ) { PSCE_PRIVILEGE_ASSIGNMENT pTempRight; while ( pRights != NULL ) { if ( pRights->Name != NULL ) ScepFree(pRights->Name); ScepFreeNameList(pRights->AssignedTo); pTempRight = pRights; pRights = pRights->Next; ScepFree( pTempRight ); } return(SCESTATUS_SUCCESS); } SCESTATUS ScepFreeObjectSecurity( IN PSCE_OBJECT_ARRAY pObject ) /* ++ Routine Description: This routine frees memory associated with ppObject. Arguments: ppObject - buffer for object security Return value: SCESTATUS_SUCCESS -- */ { PSCE_OBJECT_SECURITY pCurObject; DWORD i; if ( pObject == NULL ) return(SCESTATUS_SUCCESS); for ( i=0; iCount; i++ ) { pCurObject = pObject->pObjectArray[i]; if ( pCurObject != NULL ) { if ( pCurObject->Name != NULL ) ScepFree( pCurObject->Name ); if ( pCurObject->pSecurityDescriptor != NULL ) ScepFree(pCurObject->pSecurityDescriptor); // if ( pCurObject->SDspec != NULL ) // ScepFree( pCurObject->SDspec ); ScepFree( pCurObject ); } } ScepFree(pObject); return(SCESTATUS_SUCCESS); } VOID SceFreePSCE_SERVICES( IN PSCE_SERVICES pServiceList ) /* Routine Description: Free memory allocated in PSCE_SERVICES structure Arguments: pServiceList - the list of services node Return Value: none */ { PSCE_SERVICES pTemp=pServiceList, pTemp2; while ( pTemp != NULL ) { // // ServiceName // if ( NULL != pTemp->ServiceName ) { LocalFree(pTemp->ServiceName); } // // display name // if ( NULL != pTemp->DisplayName ) { LocalFree(pTemp->DisplayName); } // // pSecurityDescriptor or ServiceEngineName // in same address // if ( NULL != pTemp->General.pSecurityDescriptor ) { LocalFree(pTemp->General.pSecurityDescriptor); } pTemp2 = pTemp; pTemp = pTemp->Next; // free the service node LocalFree(pTemp2); } return; } SCESTATUS ScepFreePrivilegeValueList( IN PSCE_PRIVILEGE_VALUE_LIST pPrivValueList ) /* ++ Routine Description: This routine frees memory associated with PSCE_PRIVILEGE_VALUE_LIST list Arguments: pPrivValueList - a PRIVILEGE_VALUE_LIST Return value: SCESTATUS_SUCCESS -- */ { PSCE_PRIVILEGE_VALUE_LIST pCurName; PSCE_PRIVILEGE_VALUE_LIST pTempName; SCESTATUS rc=SCESTATUS_SUCCESS; if ( pPrivValueList == NULL ) return(rc); pCurName = pPrivValueList; while ( pCurName != NULL ) { if ( pCurName->Name != NULL ) __try { ScepFree( pCurName->Name ); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } pTempName = pCurName; pCurName = pCurName->Next; __try { ScepFree( pTempName ); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } return(rc); } SCESTATUS ScepFreeNameStatusList( IN PSCE_NAME_STATUS_LIST pNameList ) /* ++ Routine Description: This routine frees memory associated with PSCE_NAME_STATUS_LIST pNameList Arguments: pNameList - a NAME_STATUS_LIST Return value: SCESTATUS_SUCCESS -- */ { PSCE_NAME_STATUS_LIST pCurName; PSCE_NAME_STATUS_LIST pTempName; SCESTATUS rc=SCESTATUS_SUCCESS; if ( pNameList == NULL ) return(rc); pCurName = pNameList; while ( pCurName != NULL ) { if ( pCurName->Name != NULL ) __try { ScepFree( pCurName->Name ); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } pTempName = pCurName; pCurName = pCurName->Next; __try { ScepFree( pTempName ); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } return(rc); } SCESTATUS ScepFreeGroupMembership( IN PSCE_GROUP_MEMBERSHIP pGroup ) { PSCE_GROUP_MEMBERSHIP pTempGroup; while ( pGroup != NULL ) { if (pGroup->GroupName != NULL) ScepFree(pGroup->GroupName); // // free group members name list // ScepFreeNameList(pGroup->pMembers); ScepFreeNameList(pGroup->pMemberOf); ScepFreeNameStatusList(pGroup->pPrivilegesHeld); pTempGroup = pGroup; pGroup = pGroup->Next; ScepFree( pTempGroup ); } return(SCESTATUS_SUCCESS); } SCESTATUS ScepFreeObjectList( IN PSCE_OBJECT_LIST pNameList ) /* ++ Routine Description: This routine frees memory associated with PSCE_OBJECT_LIST pNameList Arguments: pNameList - a OBJEcT_LIST Return value: SCESTATUS_SUCCESS -- */ { PSCE_OBJECT_LIST pCurName; PSCE_OBJECT_LIST pTempName; SCESTATUS rc=SCESTATUS_SUCCESS; if ( pNameList == NULL ) return(rc); pCurName = pNameList; while ( pCurName != NULL ) { if ( pCurName->Name != NULL ) __try { ScepFree( pCurName->Name ); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } pTempName = pCurName; pCurName = pCurName->Next; __try { ScepFree( pTempName ); } __except (EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); rc = SCESTATUS_INVALID_PARAMETER; } } return(rc); } SCESTATUS ScepFreeObjectChildren( IN PSCE_OBJECT_CHILDREN pNameArray ) /* ++ Routine Description: This routine frees memory associated with PSCE_OBJECT_LIST pNameList Arguments: pNameList - a OBJEcT_LIST Return value: SCESTATUS_SUCCESS -- */ { SCESTATUS rc=SCESTATUS_SUCCESS; if ( pNameArray == NULL ) return(rc); rc = ScepFreeObjectChildrenNode(pNameArray->nCount, &(pNameArray->arrObject)); ScepFree(pNameArray); return(rc); } SCESTATUS ScepFreeObjectChildrenNode( IN DWORD Count, IN PSCE_OBJECT_CHILDREN_NODE *pArrObject ) { SCESTATUS rc=SCESTATUS_SUCCESS; if ( NULL == pArrObject ) { return(rc); } DWORD i; for ( i=0; iName ) { ScepFree( pArrObject[i]->Name ); } ScepFree(pArrObject[i]); } } return(rc); } SCESTATUS SceSvcpFreeMemory( IN PVOID pvServiceInfo ) { // // since PSCESVC_CONFIGURATION_INFO and PSCESVC_ANALYSIS_INFO contains // the same bytes, we just cast ServiceInfo to one type and free it. // if ( pvServiceInfo != NULL ) { __try { for ( DWORD i=0; i<*((DWORD *)pvServiceInfo); i++ ) { if ( ((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Key ) { ScepFree(((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Key); } if ( ((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Value ) { ScepFree(((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines[i].Value); } } ScepFree(((PSCESVC_ANALYSIS_INFO)pvServiceInfo)->Lines); ScepFree(pvServiceInfo); } __except(EXCEPTION_EXECUTE_HANDLER) { ASSERT(FALSE); return(SCESTATUS_INVALID_PARAMETER); } } return(SCESTATUS_SUCCESS); }