home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 October / PCWorld_1999-10_cd1.bin / Hardware / Drivers / APISpy / LogAPI.cpp < prev    next >
C/C++ Source or Header  |  1999-07-19  |  5KB  |  195 lines

  1. // ----------------------------------- //
  2. //            APISpy32 v2.0            //
  3. //     Copyright 1999 Yariv Kaplan     //
  4. //          WWW.INTERNALS.COM          //
  5. // ----------------------------------- //
  6.  
  7. #include <windows.h>
  8. #include "LogAPI.h"
  9.  
  10. #ifdef WINNT
  11.  
  12. #pragma comment(linker, "/section:.sdata,RWS")
  13.  
  14. #pragma data_seg(".sdata")
  15.  
  16. #endif
  17.  
  18. bool CaptureEvents = false;
  19. DWORD dwAPISpy32ProcessId = 0;
  20.  
  21. #ifdef WINNT
  22.  
  23. #pragma data_seg()
  24.  
  25. #endif
  26.  
  27. #ifdef WINNT
  28.  
  29. bool AddLogEntry(DWORD dwProcessId, PSTR pszAPIName, DWORD dwReturnValue, PVOID pvOriginAddress)
  30. {
  31.   HANDLE hMailslot;
  32.   DWORD dwBytesWritten;
  33.   tagLogEntry LogEntry;
  34.   BOOL Result;
  35.  
  36.   if (CaptureEvents == false || dwProcessId == dwAPISpy32ProcessId)
  37.     return true;
  38.  
  39.   hMailslot = CreateFile("\\\\.\\mailslot\\APISpy32_Mailslot", GENERIC_WRITE,
  40.                          FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  41.  
  42.   if (hMailslot == INVALID_HANDLE_VALUE)
  43.     return false;
  44.  
  45.   LogEntry.dwProcessId = dwProcessId;
  46.   LogEntry.dwReturnValue = dwReturnValue;
  47.   LogEntry.pvOriginAddress = pvOriginAddress;
  48.  
  49.   strcpy(LogEntry.szAPIName, pszAPIName);
  50.  
  51.   Result = WriteFile(hMailslot, &LogEntry, sizeof(tagLogEntry), &dwBytesWritten, NULL);
  52.  
  53.   CloseHandle(hMailslot);
  54.   
  55.   return Result!=0;
  56. }
  57.  
  58. #endif
  59.  
  60. #ifdef WIN95
  61.  
  62. tagLogEntry LogBuffer[MAX_LOG_ENTRIES];
  63.  
  64. DWORD dwReadLogIndex = 0, dwWriteLogIndex = 0;
  65.  
  66. bool AddLogEntry(DWORD dwProcessId, PSTR pszAPIName, DWORD dwReturnValue, PVOID pvOriginAddress)
  67. {
  68.   HANDLE hOverflowEvent;
  69.   HANDLE hLogEvent;
  70.   HANDLE hLogMutex;
  71.  
  72.   if (CaptureEvents == false || dwProcessId == dwAPISpy32ProcessId)
  73.     return true;
  74.  
  75.   hLogMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "APISpy32_LogMutex");
  76.  
  77.   if (hLogMutex == NULL)
  78.     return false;
  79.  
  80.   WaitForSingleObject(hLogMutex, INFINITE);
  81.  
  82.   LogBuffer[dwWriteLogIndex].dwProcessId = dwProcessId;
  83.   LogBuffer[dwWriteLogIndex].dwReturnValue = dwReturnValue;
  84.   LogBuffer[dwWriteLogIndex].pvOriginAddress = pvOriginAddress;
  85.  
  86.   if (strlen(pszAPIName) > MAX_API_LEN)
  87.   {
  88.     memcpy(LogBuffer[dwWriteLogIndex].szAPIName, pszAPIName, MAX_API_LEN - 3);
  89.  
  90.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN - 3] = '.';
  91.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN - 2] = '.';
  92.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN - 1] = '.';
  93.     LogBuffer[dwWriteLogIndex].szAPIName[MAX_API_LEN] = '\0';
  94.   }
  95.   else
  96.     strcpy(LogBuffer[dwWriteLogIndex].szAPIName, pszAPIName);
  97.  
  98.   if ((dwReadLogIndex != 0 && dwWriteLogIndex == dwReadLogIndex - 1) ||
  99.       (dwReadLogIndex == 0 && dwWriteLogIndex == MAX_LOG_ENTRIES - 1 ))
  100.   {
  101.     hOverflowEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "APISpy32_OverflowEvent");
  102.  
  103.     if (hOverflowEvent == NULL)
  104.     {
  105.       ReleaseMutex(hLogMutex);
  106.       CloseHandle(hLogMutex);
  107.       return false;
  108.     }
  109.  
  110.     hLogEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "APISpy32_LogEvent");
  111.  
  112.     if (hLogEvent == NULL)
  113.     {
  114.       CloseHandle(hOverflowEvent);
  115.       ReleaseMutex(hLogMutex);
  116.       CloseHandle(hLogMutex);
  117.       return false;
  118.     }
  119.  
  120.     SetEvent(hOverflowEvent);
  121.     WaitForSingleObject(hLogEvent, INFINITE);
  122.     ResetEvent(hLogEvent);
  123.     CloseHandle(hOverflowEvent);
  124.     CloseHandle(hLogEvent);
  125.   }
  126.  
  127.   dwWriteLogIndex++;
  128.  
  129.   if (dwWriteLogIndex == MAX_LOG_ENTRIES)
  130.     dwWriteLogIndex = 0;
  131.  
  132.   ReleaseMutex(hLogMutex);
  133.  
  134.   CloseHandle(hLogMutex);
  135.  
  136.   return true;
  137. }
  138.  
  139.  
  140. extern "C" __declspec(dllexport) bool GetLogParameters(DWORD *pdwNumLogEntries, DWORD *pdwReadLogIndex, tagLogEntry **ppLogBuffer)
  141. {
  142.   HANDLE hLogMutex;
  143.   DWORD Result;
  144.   
  145.   hLogMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "APISpy32_LogMutex");
  146.  
  147.   if (hLogMutex == NULL)
  148.     return false;
  149.  
  150.   Result = WaitForSingleObject(hLogMutex, INFINITE);
  151.  
  152.   if (Result == WAIT_FAILED)
  153.   {
  154.     CloseHandle(hLogMutex);
  155.     return false;
  156.   }
  157.  
  158.   *ppLogBuffer = &LogBuffer[0];
  159.   *pdwReadLogIndex = dwReadLogIndex;
  160.  
  161.   if (dwWriteLogIndex >= dwReadLogIndex)
  162.     *pdwNumLogEntries = dwWriteLogIndex - dwReadLogIndex;
  163.   else
  164.     *pdwNumLogEntries = dwWriteLogIndex + (MAX_LOG_ENTRIES - dwReadLogIndex);
  165.  
  166.   ReleaseMutex(hLogMutex);
  167.  
  168.   CloseHandle(hLogMutex);
  169.  
  170.   return true;
  171. }
  172.  
  173.  
  174. extern "C" __declspec(dllexport) void AdvanceToNextLogEntry()
  175. {
  176.   dwReadLogIndex++;
  177.  
  178.   if (dwReadLogIndex == MAX_LOG_ENTRIES)
  179.     dwReadLogIndex = 0;
  180. }
  181.  
  182. #endif
  183.  
  184.  
  185. extern "C" __declspec(dllexport) void SetCaptureEventsFlag(bool bNewValue)
  186. {
  187.   CaptureEvents = bNewValue;
  188. }
  189.  
  190.  
  191. extern "C" __declspec(dllexport) void SetAPISpy32ProcessId(DWORD dwProcessId)
  192. {
  193.   dwAPISpy32ProcessId = dwProcessId;
  194. }
  195.