NtGetNlsSectionPtr
NTSTATUS __stdcall NtGetNlsSectionPtr(
UINT64 SectionType,
UINT64 SectionData,
VOID *ContextData,
VOID **SectionPointer,
UINT64 *SectionSize,
INT64 a6,
INT64 a7,
INT64 a8){
unsigned int v9;
unsigned int v10;
char PreviousMode;
__int64 v12;
__int64 v13;
NTSTATUS result;
int Section;
_UNICODE_STRING *v16;
_ADAPTER_OBJECT *v17;
NTSTATUS v18;
PVOID *Object;
PVOID *Objecta;
POBJECT_HANDLE_INFORMATION HandleInformation;
POBJECT_HANDLE_INFORMATION HandleInformationa;
UINT64 AllocationType;
UINT64 Win32Protect;
VOID *SectionHandle;
VOID *FileHandle;
PVOID SectionToMap;
VOID *CapturedBase;
UINT64 ViewSize;
_LARGE_INTEGER SectionOffset;
_UNICODE_STRING v31;
_UNICODE_STRING DestinationString;
_OBJECT_ATTRIBUTES ObjectAttributes;
_OBJECT_ATTRIBUTES v34;
_IO_STATUS_BLOCK IoStatusBlock;
__int16 SectionName[64];
__int16 FileName[64];
v9 = SectionData;
v10 = SectionType;
*(&ObjectAttributes.Length + 1) = 0;
*(&ObjectAttributes.Attributes + 1) = 0;
v31 = 0i64;
FileHandle = 0i64;
SectionHandle = 0i64;
IoStatusBlock = 0i64;
CapturedBase = 0i64;
ViewSize = 0i64;
if( !SectionPointer )
return -1073741582;
if( !SectionSize )
return -1073741581;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
v12 = (__int64)SectionPointer;
if( (unsigned __int64)SectionPointer >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
*(_QWORD *)v12 = *(_QWORD *)v12;
v13 = (__int64)SectionSize;
if( (unsigned __int64)SectionSize >= 0x7FFFFFFF0000i64 )
v13 = 0x7FFFFFFF0000i64;
*(_QWORD *)v13 = *(_QWORD *)v13;
if( ContextData )
{
if( ((unsigned __int8)ContextData & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)ContextData + 4 > 0x7FFFFFFF0000i64 || (char *)ContextData + 4 < ContextData )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
result = RtlpInitNlsSectionName(
v10,
(unsigned int)SectionData,
(WCHAR *)SectionName,
(_UNICODE_STRING *)SectionPointer,
&v31);
if( result >= 0 )
{
ObjectAttributes.Length = 48;
ObjectAttributes.RootDirectory = 0i64;
ObjectAttributes.Attributes = 720;
ObjectAttributes.ObjectName = &v31;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
if( v10 - 11 > 1 )
{
Section = -1073741823;
}
else
{
Section = ZwOpenSection(&SectionHandle, 4ui64, &ObjectAttributes);
if( Section < 0 )
{
*(&v34.Length + 1) = 0;
*(&v34.Attributes + 1) = 0;
DestinationString = 0i64;
result = RtlpInitNlsFileName(v10, v9, (WCHAR *)FileName, v16, &DestinationString);
if( result < 0 )
return result;
v34.Length = 48;
v34.RootDirectory = 0i64;
v34.Attributes = 576;
v34.ObjectName = &DestinationString;
*(_OWORD *)&v34.SecurityDescriptor = 0i64;
LODWORD(HandleInformation) = 0;
LODWORD(Object) = 1;
result = ZwOpenFile(&FileHandle, 0x100000ui64, &v34, &IoStatusBlock, (UINT64)Object, (UINT64)HandleInformation);
if( result < 0 )
return result;
LODWORD(HandleInformationa) = 0x8000000;
LODWORD(Objecta) = 2;
Section = ZwCreateSection(
(UINT64)&SectionHandle,
4ui64,
(INT64)&ObjectAttributes,
0i64,
(INT64)Objecta,
(INT64)HandleInformationa,
(UINT64)FileHandle);
ZwClose((_HANDLE)FileHandle);
}
}
if( Section >= 0 )
{
SectionToMap = 0i64;
Section = ObReferenceObjectByHandle(SectionHandle, 0xF001Fui64, MmSectionObjectType, 0, &SectionToMap, 0i64);
ZwClose((_HANDLE)SectionHandle);
if( Section >= 0 )
{
SectionOffset.QuadPart = 0i64;
if( PreviousMode )
{
LODWORD(Win32Protect) = 2;
LODWORD(AllocationType) = 0x400000;
v17 = (_ADAPTER_OBJECT *)SectionToMap;
v18 = MmMapViewOfSection(
SectionToMap,
KeGetCurrentThread()->ApcState.Process,
&CapturedBase,
0i64,
0i64,
&SectionOffset,
&ViewSize,
ViewShare,
AllocationType,
Win32Protect);
}
else
{
v17 = (_ADAPTER_OBJECT *)SectionToMap;
v18 = MmMapViewInSystemSpace(SectionToMap, &CapturedBase, &ViewSize);
}
Section = v18;
HalPutDmaAdapter(v17);
if( Section >= 0 )
{
*SectionPointer = CapturedBase;
*SectionSize = ViewSize;
}
}
}
return Section;
}
return result;
}Referenced by:
No references.