IoConvertFileHandleToKernelHandle
NTSTATUS __stdcall IoConvertFileHandleToKernelHandle(
PVOID Handle,
INT8 PreviousMode,
UINT64 DesiredAccess,
UINT8 OverrideAccessCheck,
PVOID *KernelHandle){
PVOID *v5;
int v7;
NTSTATUS result;
int v10;
struct _DMA_ADAPTER *v11;
int v12;
HANDLE v13;
struct _OBJECT_HANDLE_INFORMATION HandleInformation;
HANDLE Handlea;
PVOID Object;
v5 = KernelHandle;
Handlea = 0i64;
v7 = DesiredAccess;
HandleInformation = 0i64;
*KernelHandle = 0i64;
if( !Handle )
return 0;
KernelHandle = 0i64;
result = ObReferenceObjectByHandle(
Handle,
0,
(POBJECT_TYPE)IoFileObjectType,
PreviousMode,
(PVOID *)&KernelHandle,
&HandleInformation);
if( result >= 0 )
{
if( OverrideAccessCheck || (v7 & HandleInformation.GrantedAccess) == v7 )
{
v10 = ObDuplicateObject(
*((_QWORD *)KeGetCurrentThread() + 23),
Handle,
PsInitialSystemProcess,
&Handlea,
v7,
512,
0,
0);
v11 = (struct _DMA_ADAPTER *)KernelHandle;
v12 = v10;
if( v10 >= 0 )
{
v13 = Handlea;
Object = 0i64;
v12 = ObReferenceObjectByHandle(Handlea, 0, (POBJECT_TYPE)IoFileObjectType, 0, &Object, 0i64);
if( v12 < 0 )
{
ObCloseHandle(v13, 0);
}
else
{
if( Object == v11 )
{
*v5 = v13;
}
else
{
v12 = -1073741788;
ObCloseHandle(v13, 0);
}
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
}
}
}
else
{
v11 = (struct _DMA_ADAPTER *)KernelHandle;
v12 = -1073741790;
}
HalPutDmaAdapter(v11);
return v12;
}
return result;
}Referenced by:
CmpNameFromAttributes
ExpQueryCodeIntegrityCertificateInfo
ExpQueryElamCertInfo
IopOpenLinkOrRenameTarget
NtRestoreKey
NtSaveKeyEx
NtSaveMergedKeys