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

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1994-1995  Microsoft Corporation
  3. Module Name:
  4.     Support.c
  5. Abstract:
  6.     Support routines for compact utility
  7. Author:
  8.     Matthew Bradburn    [mattbr]        05-Oct-1994
  9. Revision History:
  10. --*/
  11. #define UNICODE
  12. #define _UNICODE
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <io.h>
  16. #include <windows.h>
  17. #include "support.h"
  18. #include "msg.h"
  19. //
  20. //  Declare routines to put out internationalized messages
  21. //
  22. typedef enum {
  23.     READ_ACCESS,
  24.     WRITE_ACCESS
  25. } STREAMACCESS;
  26. HANDLE
  27. GetStandardStream(
  28.     IN HANDLE   Handle,
  29.     IN STREAMACCESS Access
  30.     );
  31. HANDLE hInput;
  32. HANDLE hOutput;
  33. HANDLE hError;
  34. #define STDIN   0
  35. #define STDOUT  1
  36. #define STDERR  2
  37. BOOL ConsoleInput;
  38. BOOL ConsoleOutput;
  39. BOOL ConsoleError;
  40. int
  41. FileIsConsole(int fh)
  42. {
  43.     unsigned htype;
  44.     DWORD dwMode;
  45.     HANDLE hFile;
  46.     hFile = (HANDLE)_get_osfhandle(fh);
  47.     htype = GetFileType(hFile);
  48.     htype &= ~FILE_TYPE_REMOTE;
  49.     if (FILE_TYPE_CHAR == htype) {
  50.         switch (fh) {
  51.         case STDIN:
  52.             hFile = GetStdHandle(STD_INPUT_HANDLE);
  53.             break;
  54.         case STDOUT:
  55.             hFile = GetStdHandle(STD_OUTPUT_HANDLE);
  56.             break;
  57.         case STDERR:
  58.             hFile = GetStdHandle(STD_ERROR_HANDLE);
  59.             break;
  60.         }
  61.         if (GetConsoleMode(hFile, &dwMode)) {
  62.             return TRUE;
  63.         }
  64.     }
  65.     return FALSE;
  66. }
  67. VOID
  68. InitializeIoStreams()
  69. {
  70. #ifdef FE_SB
  71.     LANGID LangId;
  72.     switch (GetConsoleOutputCP()) {
  73.         case 932:
  74.             LangId = MAKELANGID( LANG_JAPANESE, SUBLANG_DEFAULT );
  75.             break;
  76.         case 949:
  77.             LangId = MAKELANGID( LANG_KOREAN, SUBLANG_KOREAN );
  78.             break;
  79.         case 936:
  80.             LangId = MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED );
  81.             break;
  82.         case 950:
  83.             LangId = MAKELANGID( LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL );
  84.             break;
  85.         default:
  86.             LangId = MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT );
  87.             break;
  88.     }
  89.     SetThreadLocale( MAKELCID(LangId, SORT_DEFAULT) );
  90. #endif
  91.     hInput = GetStdHandle(STD_INPUT_HANDLE);
  92.     ConsoleInput = FileIsConsole(STDIN);
  93.     hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  94.     ConsoleOutput = FileIsConsole(STDOUT);
  95.     hError = GetStdHandle(STD_ERROR_HANDLE);
  96.     ConsoleError = FileIsConsole(STDERR);
  97. }
  98. TCHAR DisplayBuffer[4096];
  99. CHAR DisplayBuffer2[4096];
  100. VOID
  101. DisplayMsg(DWORD MsgNum, ... )
  102. {
  103.     DWORD len, bytes_written;
  104.     BOOL success;
  105.     DWORD status;
  106.     va_list ap;
  107.     va_start(ap, MsgNum);
  108.     len = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, NULL, MsgNum, 0,
  109.         DisplayBuffer, 4096, &ap);
  110.        
  111.     if (ConsoleOutput) {
  112.         success = WriteConsole(hOutput, (LPVOID)DisplayBuffer, len,
  113.                  &bytes_written, NULL);
  114.     } else {
  115.         CharToOem(DisplayBuffer, DisplayBuffer2);
  116.         success = WriteFile(hOutput, (LPVOID)DisplayBuffer2, len,
  117.                  &bytes_written, NULL);
  118.     }
  119.     if (!success || bytes_written != len) {
  120.         status = GetLastError();
  121.     }
  122.     va_end(ap);
  123. }
  124. VOID
  125. DisplayErr(
  126.     PTCHAR Prefix,
  127.     DWORD MsgNum,
  128.     ...
  129.     )
  130. {
  131.     DWORD len, bytes_written;
  132.     BOOL success;
  133.     DWORD status;
  134.     va_list ap;
  135.     ULONG i;
  136.     va_start(ap, MsgNum);
  137.     if (NULL != Prefix) {
  138.         lstrcpy(DisplayBuffer, Prefix);
  139.         lstrcat(DisplayBuffer, TEXT(": "));
  140.     } else {
  141.         DisplayBuffer[0] = UNICODE_NULL;
  142.     }
  143.     i = lstrlen(DisplayBuffer);
  144.     len = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, MsgNum, 0,
  145.         DisplayBuffer + i, 4096 - i, &ap);
  146.     if (ConsoleError) {
  147.         success = WriteConsole(hError, (LPVOID)DisplayBuffer, len + i,
  148.                  &bytes_written, NULL);
  149.     } else {
  150.         CharToOem(DisplayBuffer, DisplayBuffer2);
  151.         success = WriteFile(hError, (LPVOID)DisplayBuffer2, len + i,
  152.                  &bytes_written, NULL);
  153.     }
  154.     if (!success) {
  155.         status = GetLastError();
  156.     }    
  157.     va_end(ap);
  158. }
  159. BOOLEAN
  160. IsNtldr(
  161.     PTCHAR Path
  162.     )
  163. /*++
  164. Routine Description:
  165.     Used to keep the user from compressing NTLDR (which would prevent
  166.     the machine from booting).
  167.     
  168. Arguments:
  169.     Path - the path to examine.
  170. Return Value:
  171.     TRUE - the path looks like ntldr.
  172.     FALSE - the path does not look like ntldr.
  173.     
  174. --*/
  175. {
  176.     PTCHAR pch;
  177.     // try "X:ntldr"
  178.     if (0 == lstricmp(Path + 2, TEXT("\ntldr"))) {
  179.         return TRUE;
  180.     }
  181.     // try "\machinesharentldr"
  182.     if ('\' == Path[0] && '\' != Path[1]) {
  183.         pch = lstrchr(Path + 2, '\');
  184.         if (NULL == pch) {
  185.             return FALSE;
  186.         }
  187.         pch = lstrchr(pch + 1, '\');
  188.         if (NULL == pch) {
  189.             return FALSE;
  190.         }
  191.         if (0 == lstricmp(pch, TEXT("\ntldr"))) {
  192.             return TRUE;
  193.         }
  194.     }
  195.     return FALSE;
  196. }
  197. BOOLEAN
  198. IsUncRoot(
  199.     PTCHAR Path
  200.     )
  201. /*++
  202. Routine Description:
  203.     Determine whether the given path is of the form \servershare.
  204.     
  205. Arguments:
  206.     Path - the path to examine.
  207. Return Value:
  208.     TRUE - the path looks like a unc share name.
  209.     FALSE - the path does not look like that.
  210.     
  211. --*/
  212. {
  213.     PTCHAR pch;
  214.     if ('\' != *Path || '\' != *(Path + 1)) {
  215.         return FALSE;
  216.     }
  217.     pch = lstrchr(Path + 2, '\');
  218.     if (NULL == pch) {
  219.         //
  220.         // There is no slash to seperate server and share.
  221.         //
  222.         return FALSE;
  223.     }
  224.     pch = lstrchr(pch + 1, '\');
  225.     if (NULL != pch) {
  226.         //
  227.         // There are additional component -- no match.
  228.         //
  229.         return FALSE;
  230.     }
  231.     if ('\' == *(Path + lstrlen(Path))) {
  232.     
  233.         //
  234.         // The string ends in slash -- it doesn't match.
  235.         //
  236.         return FALSE;
  237.     }
  238.     
  239.     return TRUE;
  240. }
  241. ULONG
  242. FormatFileSize(
  243.     IN PLARGE_INTEGER FileSize,
  244.     IN DWORD Width,
  245.     OUT PTCHAR FormattedSize,
  246.     IN BOOLEAN Commas
  247.     )
  248. {
  249.     TCHAR Buffer[100];
  250.     PTCHAR s, s1;
  251.     ULONG DigitIndex, Digit;
  252.     ULONG Size;
  253.     LARGE_INTEGER TempSize;
  254.     s = &Buffer[ 99 ];
  255.     *s = TEXT('');
  256.     DigitIndex = 0;
  257.     TempSize = *FileSize;
  258.     while (TempSize.HighPart != 0) {
  259.         if (TempSize.HighPart != 0) {
  260.             Digit = (ULONG)(TempSize.QuadPart % 10);
  261.             TempSize.QuadPart = TempSize.QuadPart / 10;
  262.         } else {
  263.             Digit = TempSize.LowPart % 10;
  264.             TempSize.LowPart = TempSize.LowPart / 10;
  265.         }
  266.         *--s = (TCHAR)(TEXT('0') + Digit);
  267.         if ((++DigitIndex % 3) == 0 && Commas) {
  268.             *--s = TEXT(',');
  269.         }
  270.     }
  271.     Size = TempSize.LowPart;
  272.     while (Size != 0) {
  273.         *--s = (TCHAR)(TEXT('0') + (Size % 10));
  274.         Size = Size / 10;
  275.         if ((++DigitIndex % 3) == 0 && Commas) {
  276.             *--s = TEXT(',');
  277.         }
  278.     }
  279.     if (DigitIndex == 0) {
  280.         *--s = TEXT('0');
  281.     } else if (Commas && *s == TEXT(',')) {
  282.         s += 1;
  283.     }
  284.     Size = lstrlen( s );
  285.     if (Width != 0 && Size < Width) {
  286.         s1 = FormattedSize;
  287.         while (Width > Size) {
  288.             Width -= 1;
  289.             *s1++ = TEXT(' ');
  290.         }
  291.         lstrcpy( s1, s );
  292.     } else {
  293.         lstrcpy( FormattedSize, s );
  294.     }
  295.     return lstrlen( FormattedSize );
  296. }