All pastes #2049909 Raw Edit

Mine

public text v1 · immutable
#2049909 ·published 2011-04-23 21:50 UTC
rendered paste body
/* This file has been generated by the Hex-Rays decompiler.
   Copyright (c) 2009 Hex-Rays <info@hex-rays.com>

   Detected compiler: Visual C++
*/

#include <windows.h>
#include <defs.h>


//-------------------------------------------------------------------------
// Data declarations

extern char Format[]; // idb
extern const WCHAR aItermi[]; // idb
extern const WCHAR aI_0[]; // idb
extern const WCHAR aIquery[]; // idb
extern const WCHAR aI[]; // idb
extern const WCHAR word_11C3A; // idb
extern const WCHAR SourceString[]; // idb
extern wchar_t aRegistryMachin[41]; // weak
extern const WCHAR a0[]; // idb
extern char aSystem[]; // idb
extern char aDriverMde2Pass[]; // idb
extern char aLeft4dead2_exe[15]; // weak
extern char aDriverMde1Pass[22]; // weak
extern char aHl2_exe[8]; // weak
extern char aDriverMde2Acti[]; // idb
extern char aDriverMde1Acti[22]; // weak
extern char aSmplxclntxxxx[]; // idb
extern char aExplorer_exe[13]; // weak
extern int dword_11D4C[3]; // weak
extern __int16 word_11D5A; // weak
extern int dword_11D64[3]; // weak
extern char aErrorGettinFun[]; // idb
extern char aHked[5]; // weak
extern char aUnhked[]; // idb
// extern void *KeServiceDescriptorTable; weak
// extern volatile KSYSTEM_TIME KeTickCount;
extern int dword_13004; // weak
extern int dword_13008; // weak
extern PVOID BaseAddress; // idb
extern PMDL MemoryDescriptorList; // idb
extern int dword_13014; // weak
extern int dword_13018; // weak
extern int dword_1301C; // weak
extern int dword_13024; // weak
extern int (__stdcall *dword_13028)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
extern int dword_1302C; // weak
extern int dword_13030; // weak
extern int dword_13034; // weak
extern int (__stdcall *dword_13038)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
extern int (__stdcall *dword_1303C)(_DWORD, _DWORD); // weak
extern int (__stdcall *dword_13040)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
extern int dword_13044; // weak
extern char byte_13051; // weak

//-------------------------------------------------------------------------
// Function declarations

int __stdcall sub_11006(int); // weak
int __stdcall sub_11024(int a1, int a2);
signed int __cdecl sub_1105A();
signed int __cdecl sub_110BA();
int __stdcall sub_110EA(int a1, int a2);
NTSTATUS __cdecl sub_11116();
NTSTATUS __cdecl sub_114D-----------------
signed int __cdecl sub_1105A()
{
  struct _MDL *v0; // eax@1
  signed int result; // eax@2

  v0 = MmCreateMdl(0, KeServiceDescriptorTable, 4 * (_DWORD)*(&KeServiceDescriptorTable + 2));
  MemoryDescriptorList = v0;
  if ( v0 )
  {
    MmBuildMdlForNonPagedPool(v0);
    MemoryDescriptorList->MdlFlags |= 1u;
    BaseAddress = MmMapLockedPages(MemoryDescriptorList, 0);
    dword_13014 = 1;
    result = 1;
  }
  else
  {
    result = -1;
    dword_13014 = -1;
  }
  return result;
}
// 12004: using guessed type void *KeServiceDescriptorTable;
// 13014: using guessed type int dword_13014;

//----- (000110BA) --------------------------------------------------------
signed int __cdecl sub_110BA()
{
  if ( dword_13014 )
  {
    MmUnmapLockedPages(BaseAddress, MemoryDescriptorList);
    IoFreeMdl(MemoryDescriptorList);
  }
  return 1;
}
// 13014: using guessed type int dword_13014;

//----- (000110EA) --------------------------------------------------------
int __stdcall sub_110EA(int a1, int a2)
{
  int result; // eax@2
  char *v3; // ecx@3

  if ( dword_13014 )
  {
    v3 = (char *)BaseAddress + 4 * a1;
    result = *(_DWORD *)v3;
    *(_DWORD *)v3 = a2;
  }
  else
  {
    result = 0;
  }
  return result;
}
// 13014: using guessed type int dword_13014;

//----- (00011116) --------------------------------------------------------
NTSTATUS __cdecl sub_11116()
{
  NTSTATUS result; // eax@1
  OBJECT_ATTRIBUTES ObjectAttributes; // [sp+0h] [bp-140h]@1
  __int16 v2; // [sp+18h] [bp-128h]@1
  __int16 v3; // [sp+1Ah] [bp-126h]@1
  int v4; // [sp+1Ch] [bp-124h]@1
  ULONG ResultLength; // [sp+20h] [bp-120h]@2
  UNICODE_STRING DestinationString; // [sp+24h] [bp-11Ch]@2
  HANDLE Handle; // [sp+2Ch] [bp-114h]@1
  ULONG Value; // [sp+30h] [bp-110h]@4
  const UNICODE_STRING String; // [sp+34h] [bp-10Ch]@4
  char KeyValueInformation; // [sp+3Ch] [bp-104h]@2
  int v11; // [sp+40h] [bp-100h]@3
  USHORT v12; // [sp+44h] [bp-FCh]@4
  char v13; // [sp+48h] [bp-F8h]@4
  unsigned int v14; // [sp+13Ch] [bp-4h]@1
  int v15; // [sp+140h] [bp+0h]@1

  v14 = (unsigned int)&v15 ^ dword_13004;
  v2 = 80;
  v3 = 82;
  ObjectAttributes.RootDirectory = 0;
  ObjectAttributes.SecurityDescriptor = 0;
  ObjectAttributes.SecurityQualityOfService = 0;
  v4 = (int)L"\\Registry\\Machine\\Software\\SevenSoftware";
  ObjectAttributes.Length = 24;
  ObjectAttributes.Attributes = 64;
  ObjectAttributes.ObjectName = (PUNICODE_STRING)&v2;
  result = ZwOpenKey(&Handle, 1u, &ObjectAttributes);
  if ( result >= 0 )
  {
    RtlInitUnicodeString(&DestinationString, L"address");
    if ( ZwQueryValueKey(
           Handle,
           &DestinationString,
           KeyValuePartialInformation,
           &KeyValueInformation,
           256u,
           &ResultLength) >= 0 )
    {
      if ( v11 == 1 )
      {
        String.Length = v12;
        String.MaximumLength = v12;
        String.Buffer = (PWSTR)&v13;
        if ( RtlUnicodeStringToInteger(&String, 0x10u, &Value) >= 0 )
          dword_13024 = Value;
      }
    }
    RtlInitUnicodeString(&DestinationString, &word_11C3A);
    if ( ZwQueryValueKey(
           Handle,
           &DestinationString,
           KeyValuePartialInformation,
           &KeyValueInformation,
           0x100u,
           &ResultLength) >= 0 )
    {
      if ( v11 == 1 )
      {
        String.Length = v12;
        String.MaximumLength = v12;
        String.Buffer = (PWSTR)&v13;
        if ( RtlUnicodeStringToInteger(&String, 0x10u, &Value) >= 0 )
          dword_13034 = Value;
      }
    }
    RtlInitUnicodeString(&DestinationString, "i");
    if ( ZwQueryValueKey(
           Handle,
           &DestinationString,
           KeyValuePartialInformation,
           &KeyValueInformation,
           0x100u,
           &ResultLength) >= 0 )
    {
      if ( v11 == 1 )
      {
        String.Length = v12;
        String.MaximumLength = v12;
        String.Buffer = (PWSTR)&v13;
        if ( RtlUnicodeStringToInteger(&String, 0xAu, &Value) >= 0 )
          dword_13044 = Value;
      }
    }
    RtlInitUnicodeString(&DestinationString, L"iQuery");
    if ( ZwQueryValueKey(
           Handle,
           &DestinationString,
           KeyValuePartialInformation,
           &KeyValueInformation,
           0x100u,
           &ResultLength) >= 0 )
    {
      if ( v11 == 1 )
      {
        String.Length = v12;
        String.MaximumLength = v12;
        String.Buffer = (PWSTR)&v13;
        if ( RtlUnicodeStringToInteger(&String, 0xAu, &Value) >= 0 )
          dword_1302C = Value;
      }
    }
    RtlInitUnicodeString(&DestinationString, "i");
    if ( ZwQueryValueKey(
           Handle,
           &DestinationString,
           KeyValuePartialInformation,
           &KeyValueInformation,
           0x100u,
           &ResultLength) >= 0 )
    {
      if ( v11 == 1 )
      {
        String.Length = v12;
        String.MaximumLength = v12;
        String.Buffer = (PWSTR)&v13;
        if ( RtlUnicodeStringToInteger(&String, 0xAu, &Value) >= 0 )
          dword_13018 = Value;
      }
    }
    RtlInitUnicodeString(&DestinationString, L"iTermi");
    if ( ZwQueryValueKey(
           Handle,
           &DestinationString,
           KeyValuePartialInformation,
           &KeyValueInformation,
           0x100u,
           &ResultLength) >= 0 )
    {
      if ( v11 == 1 )
      {
        String.Length = v12;
        String.MaximumLength = v12;
        String.Buffer = (PWSTR)&v13;
        if ( RtlUnicodeStringToInteger(&String, 0xAu, &Value) >= 0 )
          dword_13030 = Value;
      }
    }
    result = ZwClose(Handle);
  }
  return result;
}
// 11C54: using guessed type wchar_t aRegistryMachin[41];
// 13004: using guessed type int dword_13004;
// 13018: using guessed type int dword_13018;
// 13024: using guessed type int dword_13024;
// 1302C: using guessed type int dword_1302C;
// 13030: using guessed type int dword_13030;
// 13034: using guessed type int dword_13034;
// 13044: using guessed type int dword_13044;

//----- (000114D6) --------------------------------------------------------
NTSTATUS __cdecl sub_114D6()
{
  OBJECT_ATTRIBUTES ObjectAttributes; // [sp+4h] [bp-3Ch]@1
  unsigned __int16 v2; // [sp+1Ch] [bp-24h]@2
  void *v3; // [sp+20h] [bp-20h]@2
  unsigned __int16 v4; // [sp+24h] [bp-1Ch]@2
  PVOID Data; // [sp+28h] [bp-18h]@2
  UNICODE_STRING DestinationString; // [sp+2Ch] [bp-14h]@2
  __int16 v7; // [sp+34h] [bp-Ch]@1
  __int16 v8; // [sp+36h] [bp-Ah]@1
  int v9; // [sp+38h] [bp-8h]@1
  HANDLE Handle; // [sp+3Ch] [bp-4h]@1

  v7 = 80;
  v8 = 82;
  ObjectAttributes.ObjectName = (PUNICODE_STRING)&v7;
  v9 = (int)L"\\Registry\\Machine\\Software\\SevenSoftware";
  ObjectAttributes.Length = 24;
  ObjectAttributes.RootDirectory = 0;
  ObjectAttributes.Attributes = 64;
  ObjectAttributes.SecurityDescriptor = 0;
  ObjectAttributes.SecurityQualityOfService = 0;
  if ( ZwOpenKey(&Handle, 1u, &ObjectAttributes) >= 0 )
  {
    RtlInitUnicodeString(&DestinationString, L"address");
    RtlInitUnicodeString((PUNICODE_STRING)&v4, "0");
    ZwSetValueKey(Handle, &DestinationString, 0, 1u, Data, v4);
    RtlInitUnicodeString(&DestinationString, &word_11C3A);
    RtlInitUnicodeString((PUNICODE_STRING)&v2, "0");
    ZwSetValueKey(Handle, &DestinationString, 0, 1u, v3, v2);
  }
  return ZwClose(Handle);
}
// 11C54: using guessed type wchar_t aRegistryMachin[41];

//----- (0001159A) --------------------------------------------------------
int __cdecl sub_1159A()
{
  PEPROCESS v0; // edi@1
  signed int v1; // esi@1
  int result; // eax@2

  v0 = IoGetCurrentProcess();
  v1 = 0;
  do
  {
    result = strncmp("System", (const char *)v0 + v1, 6u);
    if ( !result )
      dword_1301C = v1;
    ++v1;
  }
  while ( v1 < 12288 );
  return result;
}
// 1301C: using guessed type int dword_1301C;

//----- (000115D8) --------------------------------------------------------
char __stdcall sub_115D8(char *a1)
{
  char result; // al@2
  PEPROCESS v2; // eax@2

  if ( dword_1301C )
  {
    v2 = IoGetCurrentProcess();
    strncpy(a1, (const char *)v2 + dword_1301C, 0x10u);
    a1[16] = 0;
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}
// 1301C: using guessed type int dword_1301C;

//----- (0001161A) --------------------------------------------------------
int __stdcall sub_1161A(HANDLE Handle, int a2)
{
  char v2; // zf@2
  signed int v3; // ecx@2
  int v4; // edi@2
  char *v5; // esi@2
  char v6; // zf@8
  signed int v7; // ecx@8
  int v8; // edi@8
  char *v9; // esi@8
  CHAR *v11; // [sp-Ch] [bp-14h]@7
  PVOID Object; // [sp+4h] [bp-4h]@1

  if ( !ObReferenceObjectByHandle(Handle, 0, 0, 0, &Object, 0) )
  {
    v4 = (int)"hl2.exe";
    v5 = (char *)Object + dword_1301C;
    v3 = 8;
    v2 = 1;
    do
    {
      if ( !v3 )
        break;
      v2 = *v5++ == *(_BYTE *)v4++;
      --v3;
    }
    while ( v2 );
    if ( v2 )
    {
      byte_13051 = 0;
      sub_114D6();
      v11 = "Driver Mde 1 : Passiv";
LABEL_14:
      dword_13034 = 0;
      dword_13024 = 0;
      DbgPrint(v11);
      return dword_1303C(Handle, a2);
    }
    v9 = (char *)Object + dword_1301C;
    v8 = (int)"left4dead2.exe";
    v7 = 15;
    v6 = 1;
    do
    {
      if ( !v7 )
        break;
      v6 = *v9++ == *(_BYTE *)v8++;
      --v7;
    }
    while ( v6 );
    if ( v6 )
    {
      byte_13051 = 0;
      sub_114D6();
      v11 = "Driver Mde 2 : Passiv";
      goto LABEL_14;
    }
  }
  return dword_1303C(Handle, a2);
}
// 1303C: invalid function type has been ignored
// 1301C: using guessed type int dword_1301C;
// 13024: using guessed type int dword_13024;
// 13034: using guessed type int dword_13034;
// 1303C: using guessed type int (__stdcall *dword_1303C)(_DWORD, _DWORD);
// 13051: using guessed type char byte_13051;

//----- (000116B0) --------------------------------------------------------
int __stdcall sub_116B0(HANDLE Handle, int a2, int a3, int a4, int a5)
{
  char v5; // zf@2
  signed int v6; // ecx@2
  int v7; // edi@2
  char *v8; // esi@2
  char v9; // zf@10
  signed int v10; // ecx@10
  int v11; // edi@10
  char *v12; // esi@10
  CHAR *v14; // [sp-Ch] [bp-38h]@9
  PVOID Object; // [sp+8h] [bp-24h]@1
  int v16; // [sp+Ch] [bp-20h]@1
  int v17; // [sp+10h] [bp-1Ch]@1
  char v18; // [sp+14h] [bp-18h]@7
  unsigned int v19; // [sp+28h] [bp-4h]@1
  int v20; // [sp+2Ch] [bp+0h]@1

  v19 = (unsigned int)&v20 ^ dword_13004;
  v16 = a2;
  v17 = a3;
  if ( !ObReferenceObjectByHandle(Handle, 0, 0, 0, &Object, 0) )
  {
    v7 = (int)"hl2.exe";
    v8 = (char *)Object + dword_1301C;
    v6 = 8;
    v5 = 1;
    do
    {
      if ( !v6 )
        break;
      v5 = *v8++ == *(_BYTE *)v7++;
      --v6;
    }
    while ( v5 );
    if ( v5 )
    {
      sub_115D8(&v18);
      if ( !strncmp(&v18, "SmplxClntxxxx", 9u) && !byte_13051 )
      {
        v14 = "Driver Mde 1 : Active";
LABEL_18:
        DbgPrint(v14);
        byte_13051 = 1;
        return dword_13038(Handle, v16, v17, a4, a5);
      }
    }
    else
    {
      v12 = (char *)Object + dword_1301C;
      v11 = (int)"left4dead2.exe";
      v10 = 15;
      v9 = 1;
      do
      {
        if ( !v10 )
          break;
        v9 = *v12++ == *(_BYTE *)v11++;
        --v10;
      }
      while ( v9 );
      if ( v9 )
      {
        sub_115D8(&v18);
        if ( !strncmp(&v18, "SmplxClntxxxx", 9u) )
        {
          if ( !byte_13051 )
          {
            v14 = "Driver Mde 2 : Active";
            goto LABEL_18;
          }
        }
      }
    }
  }
  return dword_13038(Handle, v16, v17, a4, a5);
}
// 13038: invalid function type has been ignored
// 13004: using guessed type int dword_13004;
// 1301C: using guessed type int dword_1301C;
// 13038: using guessed type int (__stdcall *dword_13038)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 13051: using guessed type char byte_13051;

//----- (000117B2) --------------------------------------------------------
int __stdcall sub_117B2(HANDLE Handle, int a2, int a3, int a4, int a5, int a6)
{
  char v6; // zf@3
  signed int v7; // ecx@3
  int v8; // edi@3
  char *v9; // esi@3
  char v10; // zf@8
  signed int v11; // ecx@8
  int v12; // edi@8
  char *v13; // esi@8
  char v14; // zf@13
  signed int v15; // ecx@13
  int v16; // edi@13
  char *v17; // esi@13
  char v18; // zf@18
  signed int v19; // ecx@18
  int v20; // edi@18
  char *v21; // esi@18
  char v22; // zf@23
  signed int v23; // ecx@23
  int v24; // edi@23
  char *v25; // esi@23
  char v26; // zf@28
  signed int v27; // ecx@28
  __int16 *v28; // edi@28
  char *v29; // esi@28
  char v30; // zf@33
  signed int v31; // ecx@33
  int v32; // edi@33
  char *v33; // esi@33
  char v34; // zf@38
  signed int v35; // ecx@38
  int v36; // edi@38
  char *v37; // esi@38
  int result; // eax@48
  PVOID Object; // [sp+Ch] [bp-28h]@1
  int v40; // [sp+10h] [bp-24h]@1
  HANDLE v41; // [sp+14h] [bp-20h]@1
  unsigned int v42; // [sp+18h] [bp-1Ch]@1
  char v43; // [sp+1Ch] [bp-18h]@3
  unsigned int v44; // [sp+30h] [bp-4h]@1
  int v45; // [sp+34h] [bp+0h]@1

  v44 = (unsigned int)&v45 ^ dword_13004;
  v42 = a2;
  v40 = a6;
  v41 = Handle;
  if ( ObReferenceObjectByHandle(Handle, 0, 0, 0, &Object, 0) )
    goto LABEL_55;
  if ( byte_13051 != 1 )
    goto LABEL_55;
  sub_115D8(&v43);
  v6 = 1;
  v8 = (int)"left4dead2.exe";
  v9 = (char *)Object + dword_1301C;
  v7 = 15;
  do
  {
    if ( !v7 )
      break;
    v6 = *v9++ == *(_BYTE *)v8++;
    --v7;
  }
  while ( v6 );
  if ( !v6 )
  {
    v13 = (char *)Object + dword_1301C;
    v12 = (int)"hl2.exe";
    v11 = 8;
    v10 = 1;
    do
    {
      if ( !v11 )
        break;
      v10 = *v13++ == *(_BYTE *)v12++;
      --v11;
    }
    while ( v10 );
    if ( !v10 )
      goto LABEL_55;
  }
  v16 = (int)"hl2.exe";
  v17 = &v43;
  v15 = 8;
  v14 = 1;
  do
  {
    if ( !v15 )
      break;
    v14 = *v17++ == *(_BYTE *)v16++;
    --v15;
  }
  while ( v14 );
  if ( v14 )
    goto LABEL_55;
  v20 = (int)"left4dead2.exe";
  v21 = &v43;
  v19 = 15;
  v18 = 1;
  do
  {
    if ( !v19 )
      break;
    v18 = *v21++ == *(_BYTE *)v20++;
    --v19;
  }
  while ( v18 );
  if ( v18 )
    goto LABEL_55;
  v24 = (int)dword_11D64;
  v25 = &v43;
  v23 = 12;
  v22 = 1;
  do
  {
    if ( !v23 )
      break;
    v22 = *v25++ == *(_BYTE *)v24++;
    --v23;
  }
  while ( v22 );
  if ( v22 )
    goto LABEL_55;
  v28 = &word_11D5A;
  v29 = &v43;
  v27 = 10;
  v26 = 1;
  do
  {
    if ( !v27 )
      break;
    v26 = *v29++ == *(_BYTE *)v28;
    v28 = (__int16 *)((char *)v28 + 1);
    --v27;
  }
  while ( v26 );
  if ( v26 )
    goto LABEL_55;
  v32 = (int)dword_11D4C;
  v33 = &v43;
  v31 = 13;
  v30 = 1;
  do
  {
    if ( !v31 )
      break;
    v30 = *v33++ == *(_BYTE *)v32++;
    --v31;
  }
  while ( v30 );
  if ( v30 )
    goto LABEL_55;
  v36 = (int)"explorer.exe";
  v37 = &v43;
  v35 = 13;
  v34 = 1;
  do
  {
    if ( !v35 )
      break;
    v34 = *v37++ == *(_BYTE *)v36++;
    --v35;
  }
  while ( v34 );
  if ( v34 )
    goto LABEL_55;
  if ( !dword_13024 || !dword_13034 )
    sub_11116();
  if ( !dword_13024 || !dword_13034 )
  {
LABEL_55:
    result = dword_13028(v41, v42, a3, a4, a5, v40);
  }
  else
  {
    result = dword_13028(v41, v42, a3, a4, a5, v40);
    if ( v42 >= dword_13024 )
    {
      if ( v42 < dword_13024 + dword_13034 )
      {
        if ( a4 )
        {
          *(_DWORD *)(a4 + 4) = 0;
          *(_DWORD *)(a4 + 8) = 0;
          *(_DWORD *)(a4 + 16) = 65536;
          *(_DWORD *)(a4 + 20) = 1;
          *(_DWORD *)(a4 + 24) = 0;
        }
      }
    }
  }
  return result;
}
// 13028: invalid function type has been ignored
// 11D4C: using guessed type int dword_11D4C[3];
// 11D5A: using guessed type __int16 word_11D5A;
// 11D64: using guessed type int dword_11D64[3];
// 13004: using guessed type int dword_13004;
// 1301C: using guessed type int dword_1301C;
// 13024: using guessed type int dword_13024;
// 13028: using guessed type int (__stdcall *dword_13028)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 13034: using guessed type int dword_13034;
// 13051: using guessed type char byte_13051;

//----- (00011952) --------------------------------------------------------
int __stdcall sub_11952(HANDLE Handle, int a2, int a3, int a4, int a5)
{
  int v5; // esi@1
  char v6; // zf@3
  signed int v7; // ecx@3
  int v8; // edi@3
  char *v9; // esi@3
  char v10; // zf@8
  signed int v11; // ecx@8
  int v12; // edi@8
  char *v13; // esi@8
  char v14; // zf@13
  signed int v15; // ecx@13
  int v16; // edi@13
  char *v17; // esi@13
  char v18; // zf@18
  signed int v19; // ecx@18
  int v20; // edi@18
  char *v21; // esi@18
  char v22; // zf@23
  signed int v23; // ecx@23
  int v24; // edi@23
  char *v25; // esi@23
  char v26; // zf@28
  signed int v27; // ecx@28
  __int16 *v28; // edi@28
  char *v29; // esi@28
  char v30; // zf@33
  signed int v31; // ecx@33
  int v32; // edi@33
  char *v33; // esi@33
  char v34; // zf@38
  signed int v35; // ecx@38
  int v36; // edi@38
  char *v37; // esi@38
  unsigned int v38; // eax@43
  int v39; // ecx@44
  int v41; // [sp-10h] [bp-48h]@52
  int v42; // [sp-Ch] [bp-44h]@52
  int v43; // [sp-8h] [bp-40h]@52
  int v44; // [sp-4h] [bp-3Ch]@52
  PVOID Object; // [sp+Ch] [bp-2Ch]@1
  unsigned int v46; // [sp+10h] [bp-28h]@1
  int v47; // [sp+14h] [bp-24h]@1
  HANDLE v48; // [sp+18h] [bp-20h]@1
  int v49; // [sp+1Ch] [bp-1Ch]@1
  char v50; // [sp+20h] [bp-18h]@3
  unsigned int v51; // [sp+34h] [bp-4h]@1
  int v52; // [sp+38h] [bp+0h]@1

  v51 = (unsigned int)&v52 ^ dword_13004;
  v5 = a2;
  v49 = a3;
  v47 = a5;
  v48 = Handle;
  v46 = a2;
  if ( ObReferenceObjectByHandle(Handle, 0, 0, 0, &Object, 0) || byte_13051 != 1 )
    goto LABEL_54;
  sub_115D8(&v50);
  v6 = 1;
  v8 = (int)"left4dead2.exe";
  v9 = (char *)Object + dword_1301C;
  v7 = 15;
  do
  {
    if ( !v7 )
      break;
    v6 = *v9++ == *(_BYTE *)v8++;
    --v7;
  }
  while ( v6 );
  if ( !v6 )
  {
    v13 = (char *)Object + dword_1301C;
    v12 = (int)"hl2.exe";
    v11 = 8;
    v10 = 1;
    do
    {
      if ( !v11 )
        break;
      v10 = *v13++ == *(_BYTE *)v12++;
      --v11;
    }
    while ( v10 );
    if ( !v10 )
      goto LABEL_58;
  }
  v16 = (int)"hl2.exe";
  v17 = &v50;
  v15 = 8;
  v14 = 1;
  do
  {
    if ( !v15 )
      break;
    v14 = *v17++ == *(_BYTE *)v16++;
    --v15;
  }
  while ( v14 );
  if ( v14 )
    goto LABEL_58;
  v20 = (int)"left4dead2.exe";
  v21 = &v50;
  v19 = 15;
  v18 = 1;
  do
  {
    if ( !v19 )
      break;
    v18 = *v21++ == *(_BYTE *)v20++;
    --v19;
  }
  while ( v18 );
  if ( v18 )
    goto LABEL_58;
  v24 = (int)dword_11D64;
  v25 = &v50;
  v23 = 12;
  v22 = 1;
  do
  {
    if ( !v23 )
      break;
    v22 = *v25++ == *(_BYTE *)v24++;
    --v23;
  }
  while ( v22 );
  if ( v22 )
    goto LABEL_58;
  v28 = &word_11D5A;
  v29 = &v50;
  v27 = 10;
  v26 = 1;
  do
  {
    if ( !v27 )
      break;
    v26 = *v29++ == *(_BYTE *)v28;
    v28 = (__int16 *)((char *)v28 + 1);
    --v27;
  }
  while ( v26 );
  if ( v26 )
    goto LABEL_58;
  v32 = (int)dword_11D4C;
  v33 = &v50;
  v31 = 13;
  v30 = 1;
  do
  {
    if ( !v31 )
      break;
    v30 = *v33++ == *(_BYTE *)v32++;
    --v31;
  }
  while ( v30 );
  if ( v30 )
    goto LABEL_58;
  v36 = (int)"explorer.exe";
  v37 = &v50;
  v35 = 13;
  v34 = 1;
  do
  {
    if ( !v35 )
      break;
    v34 = *v37++ == *(_BYTE *)v36++;
    --v35;
  }
  while ( v34 );
  if ( v34 )
    goto LABEL_58;
  v38 = dword_13024;
  if ( !dword_13024 || (v39 = dword_13034, !dword_13034) )
  {
    sub_11116();
    v38 = dword_13024;
    v39 = dword_13034;
  }
  if ( !v38 || !v39 )
  {
LABEL_58:
    v5 = v46;
LABEL_54:
    v44 = v47;
    v43 = a4;
    v42 = v49;
    v41 = v5;
    return dword_13040(v48, v41, v42, v43, v44);
  }
  v5 = v46;
  if ( (v46 < v38 || v46 > v38 + v39) && (v46 + a4 < v38 || v46 > v38) )
    goto LABEL_54;
  v44 = v47;
  v43 = a4;
  v42 = v49;
  v41 = 0;
  return dword_13040(v48, v41, v42, v43, v44);
}
// 13040: invalid function type has been ignored
// 11D4C: using guessed type int dword_11D4C[3];
// 11D5A: using guessed type __int16 word_11D5A;
// 11D64: using guessed type int dword_11D64[3];
// 13004: using guessed type int dword_13004;
// 1301C: using guessed type int dword_1301C;
// 13024: using guessed type int dword_13024;
// 13034: using guessed type int dword_13034;
// 13040: using guessed type int (__stdcall *dword_13040)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 13051: using guessed type char byte_13051;

//----- (00011ACA) --------------------------------------------------------
ULONG __cdecl sub_11ACA()
{
  CHAR *v1; // [sp-4h] [bp-4h]@3

  sub_114D6();
  sub_11116();
  if ( dword_1302C && dword_13044 )
  {
    dword_13040 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))sub_110EA(dword_13044, (int)sub_11952);
    dword_13038 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))sub_110EA(dword_13018, (int)sub_116B0);
    dword_13028 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))sub_110EA(
                                                                                       dword_1302C,
                                                                                       (int)sub_117B2);
    dword_1303C = (int (__stdcall *)(_DWORD, _DWORD))sub_110EA(dword_13030, (int)sub_1161A);
    v1 = "Hked";
  }
  else
  {
    v1 = "Error Gettin' Function Indexes";
  }
  return DbgPrint(v1);
}
// 13018: using guessed type int dword_13018;
// 13028: using guessed type int (__stdcall *dword_13028)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 1302C: using guessed type int dword_1302C;
// 13030: using guessed type int dword_13030;
// 13038: using guessed type int (__stdcall *dword_13038)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 1303C: using guessed type int (__stdcall *dword_1303C)(_DWORD, _DWORD);
// 13040: using guessed type int (__stdcall *dword_13040)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 13044: using guessed type int dword_13044;

//----- (00011B4E) --------------------------------------------------------
ULONG __cdecl sub_11B4E()
{
  sub_110EA(dword_13044, (int)dword_13040);
  sub_110EA(dword_13018, (int)dword_13038);
  sub_110EA(dword_1302C, (int)dword_13028);
  sub_110EA(dword_13030, (int)dword_1303C);
  return DbgPrint("UnHked");
}
// 13018: using guessed type int dword_13018;
// 13028: using guessed type int (__stdcall *dword_13028)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 1302C: using guessed type int dword_1302C;
// 13030: using guessed type int dword_13030;
// 13038: using guessed type int (__stdcall *dword_13038)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 1303C: using guessed type int (__stdcall *dword_1303C)(_DWORD, _DWORD);
// 13040: using guessed type int (__stdcall *dword_13040)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
// 13044: using guessed type int dword_13044;

//----- (00014005) --------------------------------------------------------
int __cdecl sub_14005()
{
  ULONG v0; // eax@1
  int result; // eax@5

  v0 = dword_13004;
  if ( !dword_13004 || dword_13004 == -1153374642 )
  {
    v0 = (unsigned int)&dword_13004 ^ KeTickCount.LowPart;
    dword_13004 = (unsigned int)&dword_13004 ^ KeTickCount.LowPart;
    if ( &dword_13004 == (int *)KeTickCount.LowPart )
    {
      v0 = -1153374642;
      dword_13004 = -1153374642;
    }
  }
  result = ~v0;
  dword_13008 = result;
  return result;
}
// 13004: using guessed type int dword_13004;
// 13008: using guessed type int dword_13008;

//----- (0001403E) --------------------------------------------------------
NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
  sub_14005();
  return sub_11024((int)DriverObject, (int)RegistryPath);
}

// ALL OK, 16 function(s) have been successfully decompiled