KseShimDriverIoCallbacks

NTSTATUS __stdcall KseShimDriverIoCallbacks(DRIVER_OBJECT *DriverObject, UNICODE_STRING *BaseName){
  _UNICODE_STRING *v2; 
  _DRIVER_EXTENSION *DriverExtension; 
  _UNICODE_STRING *v4; 
  NTSTATUS ShimCallbacksForDriver; 
  char *v8; 
  int(__fastcall *DriverInit)(_DRIVER_OBJECT *, _UNICODE_STRING *); 
  int(__fastcall *v10)(_DRIVER_OBJECT *, _UNICODE_STRING *); 
  void(__fastcall *DriverStartIo)(_DEVICE_OBJECT *, _IRP *); 
  void(__fastcall *v12)(_DEVICE_OBJECT *, _IRP *); 
  void(__fastcall *DriverUnload)(_DRIVER_OBJECT *); 
  void(__fastcall *v14)(_DRIVER_OBJECT *); 
  int(__fastcall *AddDevice)(_DRIVER_OBJECT *, _DEVICE_OBJECT *); 
  __int64 v16; 
  signed __int64 v17; 
  int(__fastcall **MajorFunction)(_DEVICE_OBJECT *, _IRP *); 
  signed __int64 v19; 
  __int64 v20; 
  NTSTATUS(__stdcall *v21)(_DEVICE_OBJECT *, _IRP *); 
  int(__fastcall *v22)(_DEVICE_OBJECT *, _IRP *); 
  _UNICODE_STRING TargetString; 
  UNICODE_STRING DriverFileName; 
  INT64 result; 
  void(__fastcall *v26)(_DEVICE_OBJECT *, _IRP *); 
  void(__fastcall *v27)(_DRIVER_OBJECT *); 
  __int64 v28; 
  char v29; 
  DriverExtension = DriverObject->DriverExtension;
  v4 = v2;
  memset((INT64)&result, 0i64);
  *(_QWORD *)&TargetString.Length = 0i64;
  ShimCallbacksForDriver = 0;
  TargetString.Buffer = 0i64;
  DriverFileName = 0i64;
  if( v4 )
  {
    if( dword_140C50324 == 2 && (*(_BYTE *)KseEngine & 1) == 0 )
    {
      ShimCallbacksForDriver = KsepStringDuplicateUnicode(&TargetString, v4);
      if( ShimCallbacksForDriver >= 0 )
      {
        ShimCallbacksForDriver = KsepDriverPathTail(&TargetString, &DriverFileName);
        if( ShimCallbacksForDriver >= 0 )
        {
          ShimCallbacksForDriver = KsepGetShimCallbacksForDriver((INT64)DriverObject->DriverStart, &result);
          if( ShimCallbacksForDriver >= 0 )
          {
            LODWORD(v8) = KsepPoolAllocateNonPaged(0x100ui64);
            if( v8 )
            {
              DriverInit = DriverObject->DriverInit;
              if( DriverInit )
              {
                v10 = (int(__fastcall *)(_DRIVER_OBJECT *, _UNICODE_STRING *))result;
                if( result )
                {
                  *(_QWORD *)v8 = DriverInit;
                  DriverObject->DriverInit = v10;
                }
              }
              DriverStartIo = DriverObject->DriverStartIo;
              if( DriverStartIo )
              {
                v12 = v26;
                if( v26 )
                {
                  *((_QWORD *)v8 + 1) = DriverStartIo;
                  DriverObject->DriverStartIo = v12;
                }
              }
              DriverUnload = DriverObject->DriverUnload;
              if( DriverUnload )
              {
                v14 = v27;
                if( v27 )
                {
                  *((_QWORD *)v8 + 2) = DriverUnload;
                  DriverObject->DriverUnload = v14;
                }
              }
              AddDevice = DriverExtension->AddDevice;
              if( AddDevice )
              {
                v16 = v28;
                if( v28 )
                {
                  *((_QWORD *)v8 + 3) = AddDevice;
                  DriverExtension->AddDevice = (int(__fastcall *)(_DRIVER_OBJECT *, _DEVICE_OBJECT *))v16;
                }
              }
              v17 = v8 - (char *)DriverObject;
              MajorFunction = DriverObject->MajorFunction;
              v19 = &v29 - (char *)DriverObject;
              v20 = 28i64;
              do
              {
                v21 = (NTSTATUS(__stdcall *)(_DEVICE_OBJECT *, _IRP *))*MajorFunction;
                if( *MajorFunction )
                {
                  if( v21 != IopInvalidDeviceRequest )
                  {
                    v22 = *(int(__fastcall **)(_DEVICE_OBJECT *, _IRP *))((char *)MajorFunction + v19 - 112);
                    if( v22 )
                    {
                      *(int(__fastcall **)(_DEVICE_OBJECT *, _IRP *))((char *)MajorFunction + v17 - 80) = (int(__fastcall *)(_DEVICE_OBJECT *, _IRP *))v21;
                      *MajorFunction = v22;
                    }
                  }
                }
                ++MajorFunction;
                --v20;
              }
              while( v20 );
              DriverExtension->KseCallbacks = v8;
              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,
                  v19,
                  *(_QWORD *)&TargetString.Length);
              KsepLogInfo(
                9,
                "KSE: Hooked callbacks for driver [%ws].\n",
                TargetString.Buffer,
                v19,
                *(_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