CLIENT.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright 1996 - 1997 Microsoft Corporation
  3. Module Name:
  4.     client.c
  5. Abstract:
  6.     This sample illustrates a simple client side of the DuplicateTokenEx()
  7.     server sample.
  8.     This client functions correctly on the following platforms:
  9.     Windows NT 3.5
  10.     Windows NT 3.51
  11.     Windows NT 4.0
  12.     Windows 95
  13. Author:
  14.     Scott Field (sfield)    02-Apr-96
  15. --*/
  16. #include <windows.h>
  17. #include <stdio.h>
  18. DWORD
  19. WINAPI
  20. ReadFunc(
  21.     LPVOID lpParam
  22.     );
  23. DWORD
  24. WINAPI
  25. WriteFunc(
  26.     LPVOID lpParam
  27.     );
  28. void
  29. DisplayWinError(
  30.     LPSTR szAPI,    // pointer to Ansi function name
  31.     DWORD dwError   // DWORD WinError
  32.     );
  33. #define RTN_OK 0
  34. #define RTN_USAGE 1
  35. #define RTN_ERROR 13
  36. int
  37. __cdecl
  38. main(
  39.     int argc,
  40.     char *argv[]
  41.     )
  42. {
  43.     HANDLE hFileRead;
  44.     HANDLE hFileWrite;
  45.     HANDLE hThread;
  46.     DWORD dwThreadId;
  47.     CHAR PipeIn[255];
  48.     CHAR PipeOut[255];
  49.     if(argc == 1) {
  50.         printf("Usage: %s <\\servern", argv[0]);
  51.         printf("  %s \\WINBASE (remote server is \\winbase)n", argv[0]);
  52.         printf("  %s \\. (local server)n",   argv[0]);
  53.         return RTN_USAGE;
  54.     }
  55.     //
  56.     // build Pipe names
  57.     //
  58.     wsprintf(PipeIn, "%s\pipe\rcmd_out", argv[1]);
  59.     wsprintf(PipeOut, "%s\pipe\rcmd_in", argv[1]);
  60.     //
  61.     // wait for the outbound (inbound on server-side) pipe to be available
  62.     //
  63.     WaitNamedPipe(PipeOut, NMPWAIT_WAIT_FOREVER);
  64.     hFileWrite = CreateFile(
  65.         PipeOut,
  66.         GENERIC_WRITE,
  67.         0, // exclusive open
  68.         NULL,
  69.         OPEN_EXISTING,
  70.         SECURITY_SQOS_PRESENT | SECURITY_IMPERSONATION, // server can impersonate
  71.         NULL
  72.         );
  73.     if(hFileWrite == INVALID_HANDLE_VALUE) {
  74.         DisplayWinError("CreateFile", GetLastError());
  75.         return RTN_ERROR;
  76.     }
  77.     //
  78.     // wait for the inbound (outbound on server-side) pipe to be available
  79.     // we time-out in 5 seconds because the server should be ready for us
  80.     // right-away
  81.     //
  82.     WaitNamedPipe(PipeIn, 5 * 1000);
  83.     hFileRead = CreateFile(
  84.         PipeIn,
  85.         GENERIC_READ,
  86.         0, // exclusive open
  87.         NULL,
  88.         OPEN_EXISTING,
  89.         0,
  90.         NULL
  91.         );
  92.     if(hFileRead == INVALID_HANDLE_VALUE) {
  93.         DisplayWinError("CreateFile", GetLastError());
  94.         return RTN_ERROR;
  95.     }
  96.     //
  97.     // start a thread to handle stdin redirection to the pipe
  98.     //
  99.     hThread = CreateThread(
  100.         NULL,
  101.         0,
  102.         WriteFunc,
  103.         (LPVOID)hFileWrite, // parm
  104.         0,
  105.         &dwThreadId
  106.         );
  107.     if(hThread == NULL) {
  108.         DisplayWinError("CreateThread", GetLastError());
  109.         return RTN_ERROR;
  110.     }
  111.     //
  112.     // handle stdout redirection
  113.     //
  114.     ReadFunc((LPVOID)hFileRead);
  115.     //
  116.     // if the read returned, kill the write, cleanup, and then exit
  117.     //
  118.     TerminateThread(hThread, 0xFFFFFFFF);
  119.     CloseHandle(hThread);
  120.     CloseHandle(hFileRead);
  121.     CloseHandle(hFileWrite);
  122.     return RTN_OK;
  123. }
  124. DWORD
  125. WINAPI
  126. ReadFunc(
  127.     LPVOID lpParam
  128.     )
  129. {
  130.     #define BUFFER_SIZE 4096
  131.     HANDLE hFile = (HANDLE)lpParam;
  132.     BYTE lpBuffer[BUFFER_SIZE];
  133.     DWORD dwBytesRead;
  134.     DWORD dwBytesWritten;
  135.     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  136.     DWORD dwLastError;
  137.     while (1) {
  138.         if(!ReadFile(
  139.             hFile,
  140.             lpBuffer,
  141.             BUFFER_SIZE,
  142.             &dwBytesRead,
  143.             NULL
  144.             )) {
  145.             dwLastError = GetLastError();
  146.             if(dwLastError == ERROR_NO_DATA) continue;
  147.             if(dwLastError != ERROR_MORE_DATA) break;
  148.         }
  149.         if(!WriteFile(
  150.             hStdOut,
  151.             lpBuffer,
  152.             dwBytesRead,
  153.             &dwBytesWritten,
  154.             NULL
  155.             )) break;
  156.     }
  157.     return GetLastError();
  158. }
  159. DWORD
  160. WINAPI
  161. WriteFunc(
  162.     LPVOID lpParam
  163.     )
  164. {
  165.     HANDLE hPipe = (HANDLE)lpParam;
  166.     BYTE lpBuffer[ 1 ]; // change this later
  167.     DWORD dwBytesRead;
  168.     DWORD dwBytesWritten;
  169.     HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
  170.     while (1) {
  171.         //
  172.         // TODO rework this loop to be line-based.
  173.         // this would entail doing the console buffering outselves.
  174.         //
  175.         if(!ReadFile(
  176.             hStdIn,
  177.             lpBuffer,
  178.             1,
  179.             &dwBytesRead,
  180.             NULL
  181.             )) break;
  182.         if(!WriteFile(
  183.             hPipe,
  184.             lpBuffer,
  185.             dwBytesRead,
  186.             &dwBytesWritten,
  187.             NULL
  188.             )) break;
  189.     }
  190.     return GetLastError();
  191. }
  192. void
  193. DisplayWinError(
  194.     LPSTR szAPI,    // pointer to Ansi function name
  195.     DWORD dwError   // DWORD WinError
  196.     )
  197. {
  198.     LPSTR MessageBuffer;
  199.     DWORD dwBufferLength;
  200.     //
  201.     // TODO get this fprintf out of here!
  202.     //
  203.     fprintf(stderr,"%s error!n", szAPI);
  204.     if(dwBufferLength=FormatMessageA(
  205.             FORMAT_MESSAGE_ALLOCATE_BUFFER |
  206.             FORMAT_MESSAGE_FROM_SYSTEM,
  207.             NULL,
  208.             dwError,
  209.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  210.             (LPSTR) &MessageBuffer,
  211.             0,
  212.             NULL
  213.             ))
  214.     {
  215.         DWORD dwBytesWritten; // unused
  216.         //
  217.         // Output message string on stderr
  218.         //
  219.         WriteFile(
  220.                 GetStdHandle(STD_ERROR_HANDLE),
  221.                 MessageBuffer,
  222.                 dwBufferLength,
  223.                 &dwBytesWritten,
  224.                 NULL
  225.                 );
  226.         //
  227.         // free the buffer allocated by the system
  228.         //
  229.         LocalFree(MessageBuffer);
  230.     }
  231. }