#include "sxspool.h" // save data into pool and set the index table NTSTATUS SXS_STRING_POOL::GetDataFromPoolBasedOnIndexTable( IN SXS_STRING_POOL_INDEX_ENTRY & indexData, OUT SXS_STRING_POOL_DATA & pooldata ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); IF_NOT_NTSTATUS_SUCCESS_EXIT(pooldata.NtAssign(m_pbPool + indexData.GetOffset(), indexData.GetLength())); FN_EPILOG; } NTSTATUS SXS_GUID_POOL::GetDataFromPoolBasedOnIndexTable( IN SXS_GUID_POOL_INDEX_ENTRY & indexData, OUT SXS_GUID_POOL_DATA & pooldata ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); pooldata.SetValue(*((GUID*)m_pbPool + indexData.GetOffset() / sizeof(GUID))); FN_EPILOG; } NTSTATUS SXS_GUID_POOL::HashData( IN DWORD dwFlags, IN const GUID& data, OUT ULONG& ulHashValue ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); PARAMETER_CHECK(dwFlags == 0); IF_NOT_NTSTATUS_SUCCESS_EXIT(SxspHashGUID(data, ulHashValue)); FN_EPILOG; } NTSTATUS SXS_STRING_POOL::HashData( IN DWORD dwFlags, IN const SXS_STRING_POOL_INPUT_DATA& data, OUT ULONG& ulHash ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); PARAMETER_CHECK(dwFlags == 0); IF_NOT_NTSTATUS_SUCCESS_EXIT( SxspHashString(data.GetStr(), data.GetCch(), &ulHash, m_ePooltype == SXS_POOL_TYPE_CASE_INSENSITIVE_STRING ? true : false)); FN_EPILOG; } NTSTATUS SXS_STRING_POOL::ConvertPoolDataToOutputData( IN DWORD dwFlags, IN SXS_STRING_POOL_DATA & dataInPool, OUT SXS_STRING_POOL_INPUT_DATA & dataOut ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); DWORD len = dataOut.GetCch(); PARAMETER_CHECK(dwFlags == 0); IF_NOT_NTSTATUS_SUCCESS_EXIT(SxspUTF82StringToUCS2String( 0, dataInPool.GetPtr(), dataInPool.GetCch(), dataOut.GetBuffer(), &len)); FN_EPILOG; } NTSTATUS SXS_GUID_POOL::ConvertPoolDataToOutputData( IN DWORD dwFlags, IN SXS_GUID_POOL_DATA & dataInPool, OUT GUID & dataOut ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); PARAMETER_CHECK(dwFlags == 0); dataInPool.GetValue(dataOut); FN_EPILOG; } NTSTATUS SXS_STRING_POOL::ConverInputDataIntoPoolData( IN DWORD dwFlags, IN const SXS_STRING_POOL_INPUT_DATA & dataInput, OUT SXS_STRING_POOL_DATA & dataInPool ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); IF_NOT_NTSTATUS_SUCCESS_EXIT(dataInPool.NtAssign(dataInput.GetStr(), dataInput.GetCch())); FN_EPILOG; } NTSTATUS SXS_GUID_POOL::ConverInputDataIntoPoolData( IN DWORD dwFlags, IN const GUID & dataInput, OUT SXS_GUID_POOL_DATA & dataInPool ) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); dataInPool.SetValue(dataInput); FN_EPILOG; } NTSTATUS SXS_STRING_DATA::NtAssign(PCWSTR Str, DWORD Cch) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); INTERNAL_ERROR_CHECK(m_fValueAssigned == false); m_fValueAssigned = true; m_pstrData = const_cast(Str); m_Cch = Cch; FN_EPILOG; } NTSTATUS SXS_STRING_DATA::NtAssign(PBYTE Str, DWORD Ccb) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); INTERNAL_ERROR_CHECK(m_fValueAssigned == false); m_fValueAssigned = true; IF_NOT_NTSTATUS_SUCCESS_EXIT(SxspUTF82StringToUCS2String(0, Str, Ccb, NULL, &m_Cch)); IFALLOCFAILED_EXIT(m_pstrData = FUSION_NEW_ARRAY(WCHAR, m_Cch)); m_fMemoryAllocatedInside = true; IF_NOT_NTSTATUS_SUCCESS_EXIT(SxspUTF82StringToUCS2String(0, Str, Ccb, m_pstrData, &m_Cch)); FN_EPILOG; } NTSTATUS SXS_STRING_DATA::NtAssign(PCWSTR Str, DWORD Cch) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); INTERNAL_ERROR_CHECK(m_fValueAssigned == false); m_fValueAssigned = true; IF_NOT_NTSTATUS_SUCCESS_EXIT(SxspUCS2StringToUTF8String(0, Str, Cch, NULL, &m_Cch)); IFALLOCFAILED_EXIT(m_pstrData = FUSION_NEW_ARRAY(BYTE, m_Cch)); m_fMemoryAllocatedInside = true; IF_NOT_NTSTATUS_SUCCESS_EXIT(SxspUCS2StringToUTF8String(0, Str, Cch, m_pstrData, &m_Cch)); FN_EPILOG; } NTSTATUS SXS_STRING_DATA::NtAssign(PBYTE Str, DWORD Ccb) { NTSTATUS Status = STATUS_SUCCESS; FN_TRACE_NTSTATUS(Status); INTERNAL_ERROR_CHECK(m_fValueAssigned == false); m_fValueAssigned = true; m_pstrData = Str; m_Cch = Ccb; FN_EPILOG; }