conldr.c
上传用户:ibmxxxxx
上传日期:2007-01-03
资源大小:35k
文件大小:4k
源码类别:

系统编程

开发平台:

Visual C++

  1. /*
  2. CONLDR.C -- Win32 app to interface with FILEMON.VXD
  3. File I/O monitor for Windows 95
  4. Rename to FILEMON.EXE
  5. Stan Mitchell
  6. See Stan Mitchell, "Monitoring Windows 95 File Activity in Ring 0,"
  7. Windows/DOS Developer's Journal, July 1995, pp. 6-24.
  8. Also see ftp://ftp.ora.com/pub/examples/windows/win95.update/regwiz.html
  9. */
  10. /*****       Listing 5    CONLDR.C       *****/
  11. #include <stdio.h>
  12. #include <windows.h>
  13. /* OpenVxDHandle */
  14. typedef HANDLE (WINAPI * OVH)( HANDLE ring3 ); 
  15. char *pszBase = "FILEMON"; /* Name of device */
  16. char szVxDName[MAX_PATH];
  17. HANDLE hVxD, hEvent, hEventRing0, hMap;
  18. #define DIOC_REQEVENTS 1
  19. #define DIOC_SHUTDOWN  2
  20. #define DevOut(hDev,nAPI,Data) 
  21.     DeviceIoControl( hDev, nAPI, (LPVOID)Data, 
  22.         sizeof(Data), NULL, 0, NULL, NULL )
  23. typedef char LINE[128]; /* up to 128 char */
  24. #define MAXLINE 254 /* 255 line circular buffer */
  25. #define BUFSIZE (sizeof(LINE)*(MAXLINE+2))
  26. LINE* pLineBuf; /* buffer filled by FILEMON */
  27. LPDWORD pdw; /* first line used for line ptrs */
  28. #define PRTLINE( l ) puts(l)  
  29. /* Control-C Termination Handler */
  30. BOOL WINAPI CtrlHandler( DWORD fdwCtrlType ) {
  31.     DevOut( hVxD, DIOC_SHUTDOWN, NULL ); 
  32.     if ( CloseHandle( hVxD ) )
  33.         printf("%s unloadedn",pszBase);
  34.     else  
  35.         printf("Failed unloading %sn",pszBase);
  36.     UnmapViewOfFile( pdw );
  37.     CloseHandle( hMap );
  38.     CloseHandle( hEvent );
  39. FlushFileBuffers(GetStdHandle(STD_OUTPUT_HANDLE));
  40.     return FALSE; /* call ExitProcess */
  41.     }
  42. /* Load FILEMON.VXD and display its output buffer */
  43. void main( int argc, char* argv[] ) {
  44.     DWORD   SendInfo[2];
  45. OVH lpfn = (OVH)GetProcAddress( 
  46. GetModuleHandle("kernel32"),"OpenVxDHandle");
  47. if (lpfn == NULL) {
  48. printf("Requires Windows 95n");
  49. exit(1);
  50. }
  51.     wsprintf( szVxDName, "\\.\%s", pszBase );
  52.     hVxD = CreateFile( szVxDName, 0, 0, 0, 0, 0, 0 );
  53.     if ( hVxD == INVALID_HANDLE_VALUE ) {
  54.         strcat( szVxDName, ".vxd" );
  55.         hVxD = CreateFile( szVxDName, 0, 0, 0, 
  56.            CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0 );
  57.         if ( hVxD == INVALID_HANDLE_VALUE ) {
  58.             printf( "Failed loading %sn", pszBase );
  59.             exit(1);
  60.             }
  61.         else printf( "%s is loadedn", pszBase );
  62.         }
  63.     else {
  64.         printf("%s is already loadedn", pszBase);
  65.         exit(0);
  66.         }
  67.     hMap = CreateFileMapping( (HANDLE)0xffffffff, 
  68.             NULL, PAGE_READWRITE, 0, BUFSIZE, NULL );
  69.     if (hMap == NULL) goto error; 
  70.     pdw = MapViewOfFile( hMap,FILE_MAP_WRITE,0,0,0 );
  71.     if (pdw == NULL) goto error;
  72.     pLineBuf = ((LINE*)(pdw))+1;
  73.     SetConsoleCtrlHandler(CtrlHandler,TRUE);
  74.     /* event signaled by FILEMON */
  75.     hEvent = CreateEvent(NULL,FALSE,FALSE,"FMEvent");
  76.     hEventRing0 = (*lpfn)( hEvent );
  77.     while( 1 ) {
  78.         int justAdd, prevOut, k;
  79.         SendInfo[0] = (DWORD)hEventRing0; 
  80.         SendInfo[1] = (DWORD)pdw;
  81.         /* Request lines from FILEMON */
  82.         DevOut( hVxD, DIOC_REQEVENTS, SendInfo );        
  83.         /* FILEMON signals when output ready */
  84.         switch(WaitForSingleObject(hEvent,INFINITE)) {
  85.         case WAIT_OBJECT_0:
  86.             justAdd = *pdw;
  87.             prevOut = *(pdw+1);
  88.             if ( justAdd < prevOut ) { // wrap
  89.                 for (k=prevOut+1;k<=MAXLINE;k++)
  90.                     PRTLINE( pLineBuf[k] );
  91.                 for (k=0;k<=justAdd;k++)
  92.                     PRTLINE( pLineBuf[k] );
  93.                 }
  94.             else if ( justAdd > prevOut )
  95.                 for (k=prevOut+1;k<=justAdd;k++)
  96.                     PRTLINE( pLineBuf[k] );
  97.             *(pdw+1) = justAdd;
  98.             break;
  99.             }
  100.         } // while
  101.     error:
  102.         GenerateConsoleCtrlEvent(CTRL_C_EVENT,0);
  103.     }
  104. /******************* end of file ********************/