shinit.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 4k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. #include "shprv.h"
  2. #ifdef DEBUG
  3. char ach[20];
  4. void GetTaskName(HTASK hTask, LPSTR pname, int size)
  5. {   _asm {
  6.         push    ds
  7.         les     di,pname
  8.         mov     ds,hTask
  9.         lea     si,ds:[0xF2]
  10.         movsw
  11.         movsw
  12.         movsw
  13.         movsw
  14.         xor     al,al
  15.         stosb
  16.         pop     ds
  17. }}
  18. #endif
  19. typedef struct _TASKINFO {
  20.     struct _TASKINFO   *next;           // next link
  21.     HTASK               hTask;          // task that owns this link
  22.     HMODULE             hShell16;
  23. }   TASKINFO;
  24. TASKINFO *TaskInfoList;
  25. HMODULE hShell16;
  26. //
  27. //  FindTask
  28. //
  29. TASKINFO * NEAR PASCAL FindTask()
  30. {
  31.     TASKINFO *pti;
  32.     HTASK hTask = GetCurrentTask();
  33.     for (pti=TaskInfoList; pti; pti=pti->next)
  34.     {
  35.         if (pti->hTask == hTask)
  36.             return pti;
  37.     }
  38.     pti = (TASKINFO *)LocalAlloc(LPTR, sizeof(TASKINFO));
  39.     if (pti == NULL)
  40.         return NULL;
  41.     pti->next  = TaskInfoList;
  42.     pti->hTask = hTask;
  43.     TaskInfoList = pti;
  44.     return pti;
  45. }
  46. //
  47. //  FreeTask
  48. //
  49. void NEAR PASCAL FreeTask()
  50. {
  51.     TASKINFO *pti, *p;
  52.     HTASK hTask = GetCurrentTask();
  53.     if (TaskInfoList == NULL)
  54.         return;
  55.     if (TaskInfoList->hTask == hTask)
  56.     {
  57.         pti = TaskInfoList;
  58.         TaskInfoList = pti->next;
  59.     }
  60.     else
  61.     {
  62.         for (pti=TaskInfoList; pti; p=pti,pti=pti->next)
  63.         {
  64.             if (pti->hTask == hTask)
  65.                 break;
  66.         }
  67.         if (pti == NULL)
  68.             return;
  69.         p->next = pti->next;
  70.     }
  71.     LocalFree((HLOCAL)pti);
  72. }
  73. //
  74. // load the passed library in the context of the calling app, only
  75. // once.
  76. //
  77. HMODULE _loadds NEAR PASCAL LoadShell16()
  78. {
  79.     TASKINFO *pti;
  80.     pti = FindTask();
  81.     if (pti->hShell16 == NULL)
  82.     {
  83. #ifdef DEBUG
  84.         GetTaskName(GetCurrentTask(), ach, sizeof(ach));
  85.         DebugOutput(DBF_WARNING, "SHELL: loading SHELL16 for %ls", (LPSTR)ach);
  86. #endif
  87.         pti->hShell16 = LoadLibrary("SHELL16.DLL");
  88.         //
  89.         // because we do a GetProcAddress() only once per entry point
  90.         // we cant ever *realy* free SHELL16, so we
  91.         // load it a extra time to keep it in memory until our WEP
  92.         //
  93.         if (hShell16 == NULL)
  94.             hShell16 = LoadLibrary("SHELL16.DLL");
  95.     }
  96.     return pti->hShell16;
  97. }
  98. //
  99. //  FreeShell16
  100. //
  101. void NEAR PASCAL FreeShell16()
  102. {
  103.     TASKINFO *pti;
  104.     pti = FindTask();
  105.     if (pti->hShell16)
  106.     {
  107. #ifdef DEBUG
  108.         GetTaskName(GetCurrentTask(), ach, sizeof(ach));
  109.         DebugOutput(DBF_WARNING, "SHELL: freeing SHELL16 for %ls", (LPSTR)ach);
  110. #endif
  111.         FreeLibrary(pti->hShell16);
  112.         pti->hShell16 = NULL;
  113.     }
  114. }
  115. BOOL CALLBACK LibMain(HINSTANCE hinst, UINT wDS, DWORD unused)
  116. {
  117.     return TRUE;
  118. }
  119. BOOL CALLBACK _loadds WEP(BOOL fSystemExit)
  120. {
  121.     if (hShell16)
  122.         FreeLibrary(hShell16);
  123.     hShell16 = NULL;
  124.     return TRUE;
  125. }
  126. #define DLL_PROCESS_ATTACH 1    
  127. #define DLL_PROCESS_DETACH 0    
  128. BOOL FAR PASCAL _loadds DllEntryPoint(DWORD dwReason, WORD  hInst, WORD  wDS, WORD wHeapSize, DWORD dwReserved1, WORD wReserved2)
  129. {
  130.     switch(dwReason)
  131.     {
  132.         case DLL_PROCESS_ATTACH:
  133. #ifdef DEBUG
  134.             GetTaskName(GetCurrentTask(), ach, sizeof(ach));
  135.             DebugOutput(DBF_WARNING, "SHELL: process attach for %ls", (LPSTR)ach);
  136. #endif
  137.             break;
  138.         case DLL_PROCESS_DETACH:
  139. #ifdef DEBUG
  140.             GetTaskName(GetCurrentTask(), ach, sizeof(ach));
  141.             DebugOutput(DBF_WARNING, "SHELL: process detach for %ls", (LPSTR)ach);
  142. #endif
  143.             FreeShell16();
  144.             FreeTask();
  145.             break;
  146.     }
  147.     return TRUE;
  148. }