HalpDmaInitializeMasterAdapter
NTSTATUS __stdcall HalpDmaInitializeMasterAdapter(
_HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter,
_LARGE_INTEGER ContiguousBase,
_LARGE_INTEGER ScatterBase,
UINT8 CanCross64KBoundaries){
UINT64 LowPart;
unsigned int v6;
_HALP_ALLOC_CONTEXT *v8;
UINT8 *v9;
_RTL_BITMAP *v10;
_HALP_ALLOC_CONTEXT *v11;
_HALP_ALLOC_CONTEXT *v12;
_HALP_DMA_TRANSLATION_BUFFER *TranslationBuffer;
VOID *v14;
VOID *v15;
_RTL_BITMAP *ContiguousMapRegisters;
int v18;
unsigned __int8 v19;
MasterAdapter->ContiguousAdapterQueue.Blink = &MasterAdapter->ContiguousAdapterQueue;
MasterAdapter->ContiguousAdapterQueue.Flink = &MasterAdapter->ContiguousAdapterQueue;
LowPart = ScatterBase.anonymous_0.LowPart;
MasterAdapter->ScatterAdapterQueue.Blink = &MasterAdapter->ScatterAdapterQueue;
v6 = (v18 + 31) & 0xFFFFFFE0;
MasterAdapter->ScatterAdapterQueue.Flink = &MasterAdapter->ScatterAdapterQueue;
MasterAdapter->AdapterObject.SpinLock = 0i64;
MasterAdapter->AdapterObject.GrowLock = 0i64;
MasterAdapter->AdapterObject.ContiguousMapRegisters = 0i64;
MasterAdapter->AdapterObject.IsMasterAdapter = 1;
MasterAdapter->AdapterObject.DmaCanCross64K = v19;
v9 = HalpMmAllocCtxAlloc((_HALP_ALLOC_CONTEXT *)MasterAdapter, (unsigned __int64)v6 >> 3);
if( v9 )
{
v10 = (_RTL_BITMAP *)HalpMmAllocCtxAlloc(v8, 0x10ui64);
MasterAdapter->AdapterObject.ContiguousMapRegisters = v10;
if( v10 )
{
v10->SizeOfBitMap = v6;
v10->Buffer = (unsigned int *)v9;
RtlSetAllBits(MasterAdapter->AdapterObject.ContiguousMapRegisters);
if( !(_DWORD)LowPart )
return 0;
TranslationBuffer = HalpDmaAllocateTranslationBuffer(v12, &MasterAdapter->AdapterObject.ContiguousTranslationEnd);
MasterAdapter->AdapterObject.ContiguousTranslations = TranslationBuffer;
if( TranslationBuffer )
{
v14 = MmMapIoSpaceEx(ContiguousBase, (unsigned int)LowPart, 4ui64);
v15 = v14;
if( v14 )
{
if( HalpDmaCommitContiguousMapBuffers(
&MasterAdapter->AdapterObject,
v14,
ContiguousBase.QuadPart,
((unsigned int)LowPart >> 12) + ((LowPart & 0xFFF) != 0)) )
{
MasterAdapter->ContiguousPageLimit = (unsigned int)LowPart >> 13;
return 0;
}
MmUnmapIoSpace(v15, LowPart);
}
HalpDmaFreeTranslationBuffer(MasterAdapter->AdapterObject.ContiguousTranslations);
}
}
HalpMmAllocCtxFree(v11, v9);
}
ContiguousMapRegisters = MasterAdapter->AdapterObject.ContiguousMapRegisters;
if( ContiguousMapRegisters )
HalpMmAllocCtxFree(v8, ContiguousMapRegisters);
return -1073741670;
}Referenced by:
HalpDmaInit