int CxMemFile::SetCurPos( int nPos ) { if ( !ExpandMemory(nPos) ) { return -1; } m_nPosCursor = nPos; return m_nPosCursor; }
unsigned CxMemFile::Write( const void * lpData, unsigned nSize ) { if ( m_nMemSize-m_nFilledMemSize < (signed)nSize ) { if ( !ExpandMemory(m_nMemSize+nSize) ) return 0; } memcpy(m_pMem+m_nFilledMemSize, lpData, nSize); m_nPosCursor += nSize; if ( m_nFilledMemSize < m_nPosCursor ) { m_nFilledMemSize = m_nPosCursor; } return nSize; }
/** Collect all the access policy data to mUserInfo.AccessPolicy, and save it to user profile. **/ VOID SaveAccessPolicy ( VOID ) { EFI_STATUS Status; UINTN OffSet; UINTN Size; EFI_USER_INFO_ACCESS_CONTROL Control; EFI_USER_INFO_HANDLE UserInfo; EFI_USER_INFO *Info; if (mUserInfo.AccessPolicy != NULL) { FreePool (mUserInfo.AccessPolicy); } mUserInfo.AccessPolicy = NULL; mUserInfo.AccessPolicyLen = 0; mUserInfo.AccessPolicyModified = TRUE; OffSet = 0; // // Save access right. // Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL); if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = mAccessInfo.AccessRight; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); // // Save access setup. // Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (EFI_GUID); if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = EFI_USER_INFO_ACCESS_SETUP; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); if (mAccessInfo.AccessSetup == ACCESS_SETUP_NORMAL) { CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupNormalGuid); } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_RESTRICTED) { CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupRestrictedGuid); } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_ADMIN) { CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupAdminGuid); } OffSet += sizeof (EFI_GUID); // // Save access of boot order. // Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (UINT32); if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = EFI_USER_INFO_ACCESS_BOOT_ORDER; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); CopyMem ((UINT8 *) (mUserInfo.AccessPolicy + OffSet), &mAccessInfo.AccessBootOrder, sizeof (UINT32)); OffSet += sizeof (UINT32); // // Save permit load. // if (mAccessInfo.LoadPermitLen > 0) { Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadPermitLen; if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = EFI_USER_INFO_ACCESS_PERMIT_LOAD; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadPermit, mAccessInfo.LoadPermitLen); OffSet += mAccessInfo.LoadPermitLen; } // // Save forbid load. // if (mAccessInfo.LoadForbidLen > 0) { Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadForbidLen; if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = EFI_USER_INFO_ACCESS_FORBID_LOAD; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen); OffSet += mAccessInfo.LoadForbidLen; } // // Save permit connect. // if (mAccessInfo.ConnectPermitLen > 0) { Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectPermitLen; if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = EFI_USER_INFO_ACCESS_PERMIT_CONNECT; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectPermit, mAccessInfo.ConnectPermitLen); OffSet += mAccessInfo.ConnectPermitLen; } // // Save forbid connect. // if (mAccessInfo.ConnectForbidLen > 0) { Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectForbidLen; if (mUserInfo.AccessPolicyLen - OffSet < Size) { ExpandMemory (OffSet, Size); } Control.Type = EFI_USER_INFO_ACCESS_FORBID_CONNECT; Control.Size = (UINT32) Size; CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control)); OffSet += sizeof (Control); CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectForbid, mAccessInfo.ConnectForbidLen); OffSet += mAccessInfo.ConnectForbidLen; } mUserInfo.AccessPolicyLen = OffSet; // // Save access policy. // if (mUserInfo.AccessPolicyModified && (mUserInfo.AccessPolicyLen > 0) && (mUserInfo.AccessPolicy != NULL)) { Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen); if (Info == NULL) { return ; } Status = FindInfoByType (mModifyUser, EFI_USER_INFO_ACCESS_POLICY_RECORD, &UserInfo); if (!EFI_ERROR (Status)) { Info->InfoType = EFI_USER_INFO_ACCESS_POLICY_RECORD; Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV | EFI_USER_INFO_PUBLIC | EFI_USER_INFO_EXCLUSIVE; Info->InfoSize = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen); CopyMem ((UINT8 *) (Info + 1), mUserInfo.AccessPolicy, mUserInfo.AccessPolicyLen); Status = mUserManager->SetInfo ( mUserManager, mModifyUser, &UserInfo, Info, Info->InfoSize ); mUserInfo.AccessPolicyModified = FALSE; } FreePool (Info); } if (mAccessInfo.ConnectForbid != NULL) { FreePool (mAccessInfo.ConnectForbid); mAccessInfo.ConnectForbid = NULL; } if (mAccessInfo.ConnectPermit != NULL) { FreePool (mAccessInfo.ConnectPermit); mAccessInfo.ConnectPermit = NULL; } if (mAccessInfo.LoadForbid != NULL) { FreePool (mAccessInfo.LoadForbid); mAccessInfo.LoadForbid = NULL; } if (mAccessInfo.LoadPermit != NULL) { FreePool (mAccessInfo.LoadPermit); mAccessInfo.LoadPermit = NULL; } }