KseShimDriverIoCallbacks
NTSTATUS __stdcall KseShimDriverIoCallbacks(_DRIVER_OBJECT *DriverObject, _UNICODE_STRING *BaseName){
_UNICODE_STRING *v2;
_DRIVER_EXTENSION *DriverExtension;
_UNICODE_STRING *v4;
int ShimCallbacksForDriver;
int v7;
char *NonPaged;
int(__fastcall *DriverInit)(_DRIVER_OBJECT *, _UNICODE_STRING *);
int(__fastcall *v11)(_DRIVER_OBJECT *, _UNICODE_STRING *);
void(__fastcall *DriverStartIo)(_DEVICE_OBJECT *, _IRP *);
void(__fastcall *v13)(_DEVICE_OBJECT *, _IRP *);
void(__fastcall *DriverUnload)(_DRIVER_OBJECT *);
void(__fastcall *v15)(_DRIVER_OBJECT *);
int(__fastcall *AddDevice)(_DRIVER_OBJECT *, _DEVICE_OBJECT *);
int(__fastcall *v17)(_DRIVER_OBJECT *, _DEVICE_OBJECT *);
signed __int64 v18;
int(__fastcall **MajorFunction)(_DEVICE_OBJECT *, _IRP *);
signed __int64 v20;
__int64 v21;
VOID(__fastcall *v22)(_DEVICE_OBJECT *, _IRP *);
int(__fastcall *v23)(_DEVICE_OBJECT *, _IRP *);
_UNICODE_STRING TargetString;
_UNICODE_STRING DriverFileName;
_KSE_IO_CALLBACKS IoCallbacks[64];
DriverExtension = DriverObject->DriverExtension;
v4 = v2;
memset(IoCallbacks, 0i64, sizeof(IoCallbacks));
*(_QWORD *)&TargetString.Length = 0i64;
ShimCallbacksForDriver = 0;
TargetString.Buffer = 0i64;
DriverFileName = 0i64;
if( v4 )
{
if( dword_140C50324 == 2 && (Engine & 1) == 0 )
{
KsepStringDuplicateUnicode(&TargetString, v4);
ShimCallbacksForDriver = v7;
if( v7 >= 0 )
{
ShimCallbacksForDriver = KsepDriverPathTail(&TargetString, &DriverFileName);
if( ShimCallbacksForDriver >= 0 )
{
ShimCallbacksForDriver = KsepGetShimCallbacksForDriver(DriverObject->DriverStart, IoCallbacks);
if( ShimCallbacksForDriver >= 0 )
{
NonPaged = (char *)KsepPoolAllocateNonPaged(0x100ui64);
if( NonPaged )
{
DriverInit = DriverObject->DriverInit;
if( DriverInit )
{
v11 = *(int(__fastcall **)(_DRIVER_OBJECT *, _UNICODE_STRING *))IoCallbacks;
if( *(_QWORD *)IoCallbacks )
{
*(_QWORD *)NonPaged = DriverInit;
DriverObject->DriverInit = v11;
}
}
DriverStartIo = DriverObject->DriverStartIo;
if( DriverStartIo )
{
v13 = *(void(__fastcall **)(_DEVICE_OBJECT *, _IRP *))&IoCallbacks[2];
if( *(_QWORD *)&IoCallbacks[2] )
{
*((_QWORD *)NonPaged + 1) = DriverStartIo;
DriverObject->DriverStartIo = v13;
}
}
DriverUnload = DriverObject->DriverUnload;
if( DriverUnload )
{
v15 = *(void(__fastcall **)(_DRIVER_OBJECT *))&IoCallbacks[4];
if( *(_QWORD *)&IoCallbacks[4] )
{
*((_QWORD *)NonPaged + 2) = DriverUnload;
DriverObject->DriverUnload = v15;
}
}
AddDevice = DriverExtension->AddDevice;
if( AddDevice )
{
v17 = *(int(__fastcall **)(_DRIVER_OBJECT *, _DEVICE_OBJECT *))&IoCallbacks[6];
if( *(_QWORD *)&IoCallbacks[6] )
{
*((_QWORD *)NonPaged + 3) = AddDevice;
DriverExtension->AddDevice = v17;
}
}
v18 = NonPaged - (char *)DriverObject;
MajorFunction = DriverObject->MajorFunction;
v20 = (char *)&IoCallbacks[8] - (char *)DriverObject;
v21 = 28i64;
do
{
v22 = (VOID(__fastcall *)(_DEVICE_OBJECT *, _IRP *))*MajorFunction;
if( *MajorFunction )
{
if( v22 != IopInvalidDeviceRequest )
{
v23 = *(int(__fastcall **)(_DEVICE_OBJECT *, _IRP *))((char *)MajorFunction + v20 - 112);
if( v23 )
{
*(int(__fastcall **)(_DEVICE_OBJECT *, _IRP *))((char *)MajorFunction + v18 - 80) = (int(__fastcall *)(_DEVICE_OBJECT *, _IRP *))v22;
*MajorFunction = v23;
}
}
}
++MajorFunction;
--v21;
}
while( v21 );
DriverExtension->KseCallbacks = NonPaged;
ShimCallbacksForDriver = 0;
KsepHistoryMessages[((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F] = 524550i64;
if( (KsepDebugFlag & 1) != 0 )
KsepDebugPrint(
9i64,
"KSE: Hooked callbacks for driver [%ws].\n",
TargetString.Buffer,
v20,
*(_QWORD *)&TargetString.Length);
KsepLogInfo(
9,
"KSE: Hooked callbacks for driver [%ws].\n",
TargetString.Buffer,
v20,
*(_QWORD *)&TargetString.Length);
goto LABEL_8;
}
ShimCallbacksForDriver = -1073741801;
}
}
}
KsepPoolFreeNonPaged(0i64);
}
LABEL_8:
KsepStringFree(&TargetString);
return ShimCallbacksForDriver;
}
KsepHistoryMessages[((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F] = 524436i64;
if( (KsepDebugFlag & 1) != 0 )
KsepDebugPrint(0i64, "KSE: Callback shimming - missing driver object or driver name.\n");
KsepLogInfo(0, "KSE: Callback shimming - missing driver object or driver name.\n");
return -1073741811;
}Referenced by:
IopInitializeBuiltinDriver
IopLoadDriver