⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w2k_lib.c

📁 Undocumented Windows 2000 Secrets简体中文版.+源码光盘
💻 C
📖 第 1 页 / 共 5 页
字号:

// __________________________________________________________
//
//                         w2k_lib.c
//              SBS Windows 2000 Utility Library
//                02-12-2001 Sven B. Schreiber
//                       sbs@orgon.com
// __________________________________________________________

#define  _W2K_LIB_DLL_
#include "w2k_lib.h"

// =================================================================
// DISCLAIMER
// =================================================================

/*

This software is provided "as is" and any express or implied
warranties, including, but not limited to, the implied warranties of
merchantibility and fitness for a particular purpose are disclaimed.
In no event shall the author Sven B. Schreiber be liable for any
direct, indirect, incidental, special, exemplary, or consequential
damages (including, but not limited to, procurement of substitute
goods or services; loss of use, data, or profits; or business
interruption) however caused and on any theory of liability,
whether in contract, strict liability, or tort (including negligence
or otherwise) arising in any way out of the use of this software,
even if advised of the possibility of such damage.

*/

// =================================================================
// REVISION HISTORY
// =================================================================

/*

02-12-2001 V1.00 Original version (SBS).

*/

// =================================================================
// GLOBAL VARIABLES
// =================================================================

HINSTANCE ghInstance     = NULL;

HANDLE    ghStdInput     = INVALID_HANDLE_VALUE;
HANDLE    ghStdOutput    = INVALID_HANDLE_VALUE;
HANDLE    ghStdError     = INVALID_HANDLE_VALUE;

BOOL      gfStdHandles   = FALSE;
BOOL      gfStdFailure   = FALSE;
BOOL      gfStdTransient = FALSE;

LONG      glMemorySign   = 0;
DWORD     gdMemoryNow    = 0;
DWORD     gdMemoryMax    = 0;

WORD      gwFill         = ' ';

// =================================================================
// GLOBAL STRINGS
// =================================================================

WORD awCaption             [] = L"Windows 2000 Application";

WORD awWindowsNT           [] = L"Windows NT";
WORD awWindows2000         [] = L"Windows 2000";
WORD awProfessional        [] = L" Professional";
WORD awDomainController    [] = L" Domain Controller";
WORD awServer              [] = L" Server";

WORD awHkeyClassesRoot     [] = L"HKEY_CLASSES_ROOT";
WORD awHkeyCurrentUser     [] = L"HKEY_CURRENT_USER";
WORD awHkeyLocalMachine    [] = L"HKEY_LOCAL_MACHINE";
WORD awHkeyUsers           [] = L"HKEY_USERS";
WORD awHkeyPerformanceData [] = L"HKEY_PERFORMANCE_DATA";
WORD awHkeyCurrentConfig   [] = L"HKEY_CURRENT_CONFIG";
WORD awHkeyDynData         [] = L"HKEY_DYN_DATA";

WORD awKeyClsId            [] = L"CLSID";
WORD awKeyLocalServer32    [] = L"LocalServer32";
WORD awKeyInprocServer32   [] = L"InprocServer32";

WORD awKeyMachineSoftware  [] = L"SOFTWARE";
WORD awKeyUserSoftware     [] = L"Software";
WORD awKeyCompany          [] = L"SBS";
WORD awKeyId               [] = L"- Common -";
WORD awKeyVersion          [] = L"CurrentVersion";

WORD awRoot                [] = L"\\";
WORD awNull                [] = L"";

// =================================================================
// CODE PAGE DIRECTORY
// =================================================================

VS_CODE_PAGE avcpCodePages [] =
    {
        0, L"Code Page Independent",
       37, L"EBCDIC",
      437, L"MS-DOS United States",
      500, L"EBCDIC \"500V1\"",
      708, L"Arabic (ASMO 708)",
      709, L"Arabic (ASMO 449+, BCON V4)",
      710, L"Arabic (Transparent Arabic)",
      720, L"Arabic (Transparent ASMO)",
      737, L"Greek (formerly 437G)",
      775, L"Baltic",
      850, L"MS-DOS Multilingual (Latin I)",
      852, L"MS-DOS Slavic (Latin II)",
      855, L"IBM Cyrillic (primarily Russian)",
      857, L"IBM Turkish",
      860, L"MS-DOS Portuguese",
      861, L"MS-DOS Icelandic",
      862, L"Hebrew",
      863, L"MS-DOS Canadian-French",
      864, L"Arabic",
      865, L"MS-DOS Nordic",
      866, L"MS-DOS Russian",
      869, L"IBM Modern Greek",
      874, L"Thai",
      875, L"EBCDIC",
      932, L"Japan",
      936, L"Chinese (PRC, Singapore)",
      949, L"Korean",
      950, L"Chinese (Taiwan, Hong Kong) ",
     1026, L"EBCDIC",
     1200, L"Unicode (BMP of ISO 10646)",
     1250, L"Windows 3.1 Eastern European ",
     1251, L"Windows 3.1 Cyrillic",
     1252, L"Windows 3.1 US (ANSI)",
     1253, L"Windows 3.1 Greek",
     1254, L"Windows 3.1 Turkish",
     1255, L"Hebrew",
     1256, L"Arabic",
     1257, L"Baltic",
     1258, L"Vietnamese",
     1361, L"Korean (Johab)",
    10000, L"Macintosh Roman",
    10001, L"Macintosh Japanese",
    10006, L"Macintosh Greek I",
    10007, L"Macintosh Cyrillic",
    10029, L"Macintosh Latin 2",
    10079, L"Macintosh Icelandic",
    10081, L"Macintosh Turkish",
    10082, L"Macintosh Croatian",
    20261, L"Teletex",
    20866, L"Cyrillic (KOI8-R)",
    28592, L"Central European (ISO)",
    28595, L"Cyrillic (ISO)",
    50000, L"User Defined",
       -1, NULL,
    };

// =================================================================
// CRC32 LOOKUP TABLE
// =================================================================

DWORD adCrc32 [256] =
    {
    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,   //0x00..0x03
    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,   //0x04..0x07
    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,   //0x08..0x0B
    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,   //0x0C..0x0F
    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,   //0x10..0x13
    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,   //0x14..0x17
    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,   //0x18..0x1B
    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,   //0x1C..0x1F
    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,   //0x20..0x23
    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,   //0x24..0x27
    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,   //0x28..0x2B
    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,   //0x2C..0x2F
    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,   //0x30..0x33
    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,   //0x34..0x37
    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,   //0x38..0x3B
    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,   //0x3C..0x3F
    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,   //0x40..0x43
    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,   //0x44..0x47
    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,   //0x48..0x4B
    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,   //0x4C..0x4F
    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,   //0x50..0x53
    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,   //0x54..0x57
    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,   //0x58..0x5B
    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,   //0x5C..0x5F
    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,   //0x60..0x63
    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,   //0x64..0x67
    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,   //0x68..0x6B
    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,   //0x6C..0x6F
    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,   //0x70..0x73
    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,   //0x74..0x77
    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,   //0x78..0x7B
    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,   //0x7C..0x7F
    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,   //0x80..0x83
    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,   //0x84..0x87
    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,   //0x88..0x8B
    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,   //0x8C..0x8F
    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,   //0x90..0x93
    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,   //0x94..0x97
    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,   //0x98..0x9B
    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,   //0x9C..0x9F
    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,   //0xA0..0xA3
    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,   //0xA4..0xA7
    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,   //0xA8..0xAB
    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,   //0xAC..0xAF
    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,   //0xB0..0xB3
    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,   //0xB4..0xB7
    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,   //0xB8..0xBB
    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,   //0xBC..0xBF
    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,   //0xC0..0xC3
    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,   //0xC4..0xC7
    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,   //0xC8..0xCB
    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,   //0xCC..0xCF
    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,   //0xD0..0xD3
    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,   //0xD4..0xD7
    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,   //0xD8..0xDB
    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,   //0xDC..0xDF
    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,   //0xE0..0xE3
    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,   //0xE4..0xE7
    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,   //0xE8..0xEB
    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,   //0xEC..0xEF
    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,   //0xF0..0xF3
    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,   //0xF4..0xF7
    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,   //0xF8..0xFB
    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D    //0xFC..0xFF
    };

// =================================================================
// SYNCHRONIZATION OBJECTS
// =================================================================

CRITICAL_SECTION gcsMemory;
CRITICAL_SECTION gcsChain;

// =================================================================
// VERSION TESTING
// =================================================================

DWORD WINAPI w2kLibVersion (void)
    {
    return W2K_LIB_VERSION;
    }

// -----------------------------------------------------------------

DWORD WINAPI w2kLibTest (DWORD dVersion)
    {
    return (dVersion <= W2K_LIB_VERSION ? 0 : W2K_LIB_VERSION);
    }

// =================================================================
// MEMORY MANAGEMENT
// =================================================================

PBYTE WINAPI w2kMemoryAnsi (DWORD dSize)
    {
    return w2kMemoryCreate (dSize);
    }

// -----------------------------------------------------------------

PWORD WINAPI w2kMemoryUnicode (DWORD dSize)
    {
    return w2kMemoryCreate (dSize * WORD_);
    }

// -----------------------------------------------------------------

PVOID WINAPI w2kMemoryCreate (DWORD dSize)
    {
    return w2kMemoryCreateEx (dSize, W2K_MEMORY_TAG);
    }

// -----------------------------------------------------------------

PVOID WINAPI w2kMemoryCreateEx (DWORD dSize,
                                DWORD dTag)
    {
    PW2K_MEMORY pwm = NULL;

    if ((W2K_MEMORY_ + dSize >= W2K_MEMORY_)
        &&
        ((pwm = LocalAlloc (LMEM_FIXED, W2K_MEMORY_ + dSize))
         != NULL))
        {
        pwm->dTag  = dTag;
        pwm->dSize = dSize;

        w2kMemoryTrack (pwm->dSize, TRUE);
        }
    return (pwm != NULL ? pwm->abData : NULL);
    }

// -----------------------------------------------------------------

PW2K_MEMORY WINAPI w2kMemoryBase (PVOID pData)
    {
    return w2kMemoryBaseEx (pData, W2K_MEMORY_TAG);
    }

// -----------------------------------------------------------------

PW2K_MEMORY WINAPI w2kMemoryBaseEx (PVOID pData,
                                    DWORD dTag)
    {
    PW2K_MEMORY pwm = (PW2K_MEMORY) ((PBYTE) pData - W2K_MEMORY_);

    if ((pData       == NULL    ) ||
        (pwm         == NULL    ) ||
        ((PVOID) pwm >= pData   ) ||
        (pwm->dTag   != dTag    ) ||
        (pwm->dSize  == MAXDWORD))
        {
        pwm = NULL;
        }
    return pwm;
    }

// -----------------------------------------------------------------

PVOID WINAPI w2kMemoryResize (PVOID pData,
                              DWORD dSize,
                              PBOOL pfOk)
    {
    return w2kMemoryResizeEx (pData, dSize, pfOk, W2K_MEMORY_TAG);
    }

// -----------------------------------------------------------------

PVOID WINAPI w2kMemoryResizeEx (PVOID pData,
                                DWORD dSize,
                                PBOOL pfOk,
                                DWORD dTag)
    {
    PW2K_MEMORY pwmNew;
    BOOL        fOk = FALSE;
    PW2K_MEMORY pwm = w2kMemoryBaseEx (pData, dTag);

    if (pwm != NULL)
        {
        fOk = TRUE;

        if (pwm->dSize != dSize)
            {
            if ((pwmNew = LocalReAlloc (pwm, W2K_MEMORY_ + dSize,
                                        LMEM_MOVEABLE))
                != NULL)
                {
                pwm = pwmNew;

                if (dSize >= pwm->dSize)
                    {
                    w2kMemoryTrack (dSize - pwm->dSize, TRUE);
                    }
                else
                    {
                    w2kMemoryTrack (pwm->dSize - dSize, FALSE);
                    }
                pwm->dSize = dSize;
                }
            else
                {
                if (pfOk != NULL)
                    {
                    fOk = FALSE;
                    }
                else
                    {
                    w2kMemoryTrack (pwm->dSize, FALSE);

                    pwm->dSize = MAXDWORD;
                    LocalFree (pwm);

                    pwm = NULL;
                    }
                }
            }
        }
    if (pfOk != NULL) *pfOk = fOk;
    return (pwm != NULL ? pwm->abData : NULL);
    }

// -----------------------------------------------------------------

PVOID WINAPI w2kMemoryDestroy (PVOID pData)
    {
    return w2kMemoryDestroyEx (pData, W2K_MEMORY_TAG);
    }

// -----------------------------------------------------------------

PVOID WINAPI w2kMemoryDestroyEx (PVOID pData,
                                 DWORD dTag)
    {
    PW2K_MEMORY pwm;

    if ((pwm = w2kMemoryBaseEx (pData, dTag)) != NULL)
        {
        w2kMemoryTrack (pwm->dSize, FALSE);

        pwm->dSize = MAXDWORD;
        LocalFree (pwm);
        }
    return NULL;
    }

// -----------------------------------------------------------------

void WINAPI w2kMemoryReset (void)
    {
    EnterCriticalSection (&gcsMemory);

    glMemorySign = 0;
    gdMemoryNow  = 0;
    gdMemoryMax  = 0;

    LeaveCriticalSection (&gcsMemory);
    return;
    }

// -----------------------------------------------------------------

void WINAPI w2kMemoryTrack (DWORD dSize,
                            BOOL  fAdd)
    {
    if (dSize)
        {
        EnterCriticalSection (&gcsMemory);

        if (fAdd)
            {
            if (gdMemoryNow + dSize < gdMemoryNow)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -