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

📄 winmain.cpp

📁 This ZIP archive includes the sources (and executable) for the FileTest utility, written by Ladisla
💻 CPP
字号:
/*****************************************************************************/
/* WinMain.cpp                            Copyright (c) Ladislav Zezula 2003 */
/*---------------------------------------------------------------------------*/
/* A file that simulates access on a file                                    */
/*---------------------------------------------------------------------------*/
/*   Date    Ver   Who  Comment                                              */
/* --------  ----  ---  -------                                              */
/* 14.07.03  1.00  Lad  The first version of WinMain.cpp                     */
/*****************************************************************************/

#include "FileTest.h"
#include "resource.h"

#pragma comment(lib, "Comctl32.lib")

//-----------------------------------------------------------------------------
// Global variables

HINSTANCE g_hInst;
HANDLE g_hHeap;
DWORD g_dwWinVer;
BOOL g_bDisableDialogDispatch = FALSE;

#define TOKEN_ELEVATION_TYPE_LIMITED_USER   0x00000001
#define TOKEN_ELEVATION_TYPE_ADMINISTRATOR  0x00000002

BOOL IsLUAEnabled()
{
    LPCTSTR szKeyName = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
    DWORD dwLuaEnabled = 0;
    DWORD dwLength = 0;
    HKEY hSubKey = NULL;

    // First, check if LUA is enabled at all
    if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_QUERY_VALUE, &hSubKey))
    {
        dwLuaEnabled = 0;        
        dwLength = sizeof(dwLuaEnabled);
        RegQueryValueEx(hSubKey, _T("EnableLUA"), NULL, NULL, (LPBYTE)&dwLuaEnabled, &dwLength);
        RegCloseKey(hSubKey);
    }

    return (BOOL)dwLuaEnabled;
}


// Returns TRUE if the program runs as restricted or elevated.
// Called on Windows Vista only
BOOL IsRunningAsElevated()
{
    HANDLE hToken;
    DWORD dwElevationType = 0;
    DWORD dwLength = 0;

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        GetTokenInformation(hToken,
                           (TOKEN_INFORMATION_CLASS)0x12,  // TokenElevationType, not defined in pre-Vista SDKs
                           &dwElevationType,
                            sizeof(dwElevationType),
                           &dwLength);

        CloseHandle(hToken);
    }

    return (dwElevationType & TOKEN_ELEVATION_TYPE_LIMITED_USER) ? FALSE : TRUE;
}

//-----------------------------------------------------------------------------
// Main dialog

INT_PTR FileTestDialog(HWND hParent, TPropSheetData * pData)
{
    PROPSHEETHEADER psh;
    PROPSHEETPAGE psp[8];
    HACCEL hAccelTable;
    TCHAR szUserName[256] = _T("");
    TCHAR szTitle[256] = _T("");
    TCHAR szFmt[256] = _T("");
    HWND hPropSheet;
    UINT nIDTitle = IDS_APP_TITLE;
    MSG msg;
    int nPages = 0;

    // In Vista, also reflect if we are elevated or not
    // First, check if LUA is enabled at all
    if(g_dwWinVer >= OSVER_WINDOWS_VISTA && IsLUAEnabled())
        nIDTitle = IsRunningAsElevated() ? IDS_APP_TITLE_VISTA1 : IDS_APP_TITLE_VISTA2;

    // Construct the dialog title
    if(LoadString(g_hInst, nIDTitle, szFmt, _tsize(szFmt)))
    {
        DWORD dwSize = _tsize(szUserName);

        GetUserName(szUserName, &dwSize);
        _stprintf(szTitle, szFmt, szUserName);
    }

    // Fill the property sheet header
    ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
    psh.dwSize     = sizeof(PROPSHEETHEADER);
    psh.dwFlags    = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_NOAPPLYNOW | PSH_NOCONTEXTHELP | PSH_MODELESS;
    psh.hwndParent = hParent;
    psh.hInstance  = g_hInst;
    psh.pszIcon    = MAKEINTRESOURCE(IDI_FILE_TEST);
    psh.pszCaption = szTitle;
    psh.nStartPage = 1;
    psh.ppsp       = psp;

    // Fill the "Transaction" page (Vista only)
    if(g_dwWinVer >= 0x0600)
    {
        ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
        psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
        psp[nPages].dwFlags     = PSP_DEFAULT;
        psp[nPages].hInstance   = g_hInst;
        psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE00_TRANSACTION);
        psp[nPages].pfnDlgProc  = PageProc00;
        psp[nPages].lParam      = (LPARAM)pData;
        nPages++;
    }

    // Fill the "CreateFile" page
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE01_CREATE);
    psp[nPages].pfnDlgProc  = PageProc01;
    psp[nPages].lParam      = (LPARAM)pData;
    psh.nStartPage = nPages;
    nPages++;

    // Fill the "ReadFile"
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE02_READFILE);
    psp[nPages].pfnDlgProc  = PageProc02;
    psp[nPages].lParam      = (LPARAM)pData;
    nPages++;

    // Fill the "WriteFile". It uses the same handler like "ReadFile"
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE03_WRITEFILE);
    psp[nPages].pfnDlgProc  = PageProc02;
    psp[nPages].lParam      = (LPARAM)pData;
    nPages++;

    // Fill the "File Ops".
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE04_FILEOPS);
    psp[nPages].pfnDlgProc  = PageProc04;
    psp[nPages].lParam      = (LPARAM)pData;
    nPages++;

    // Fill the "NtCreateFile" page
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE05_NTCREATE);
    psp[nPages].pfnDlgProc  = PageProc05;
    psp[nPages].lParam      = (LPARAM)pData;
    nPages++;

    // Fill the "NtFileInfo" page.
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE07_NTSETINFO);
    psp[nPages].pfnDlgProc  = PageProc06;
    psp[nPages].lParam      = (LPARAM)pData;
    nPages++;

    // Fill the "EA".
    ZeroMemory(&psp[nPages], sizeof(PROPSHEETPAGE));
    psp[nPages].dwSize      = sizeof(PROPSHEETPAGE);
    psp[nPages].dwFlags     = PSP_DEFAULT;
    psp[nPages].hInstance   = g_hInst;
    psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_PAGE07_EA);
    psp[nPages].pfnDlgProc  = PageProc07;
    psp[nPages].lParam      = (LPARAM)pData;
    nPages++;

    // Load accelerators and create the modeless property sheet
    psh.nPages = nPages;
    hAccelTable = LoadAccelerators(g_hInst, MAKEINTRESOURCE(IDR_ACCELERATORS));
    hPropSheet = (HWND)PropertySheet(&psh);

    // Run the modeless property sheet
    while(IsWindow(hPropSheet) && GetMessage(&msg, NULL, 0, 0))
    {
        // When the user clicks the OK or Cancel button,
        // PropSheet_GetCurrentPageHwnd returns NULL,
        // and we can then use the DestroyWindow function
        // to destroy the property sheet.
        if(PropSheet_GetCurrentPageHwnd(hPropSheet) == NULL)
            break;

        // Process the accelerator table
        if(!TranslateAccelerator(hPropSheet, hAccelTable, &msg))
        {
            // If e.g. an item on the tree view is being edited, 
            // we cannot pass the event to PropSheet_IsDialogMessage.
            // Doing so causes the property sheet to ne closed at Enter press
            // (instead of completing edit operation)
            if(g_bDisableDialogDispatch || !PropSheet_IsDialogMessage(hPropSheet, &msg))
            {
                TranslateMessage(&msg); 
                DispatchMessage(&msg); 
            }
        }
    }

    // Destroy the window and accelerator table
    DestroyWindow(hPropSheet);
    if(hAccelTable != NULL)
        DestroyAcceleratorTable(hAccelTable);

    return IDOK;
}

//-----------------------------------------------------------------------------
// WinMain

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
    OSVERSIONINFO osvi;
    TPropSheetData * pData;
    int cbFileInfoBuff = 0x10000;         // Size of the data buffer

    // Save the instance
    g_hInst = hInstance;
    g_hHeap = GetProcessHeap();
    InitCommonControls();

    // Get the Windows version
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    g_dwWinVer = (osvi.dwMajorVersion << 8) | osvi.dwMinorVersion;

    // Allocate and fill our working structure with command line parameters
    pData = (TPropSheetData *)HeapAlloc(g_hHeap, HEAP_ZERO_MEMORY, sizeof(TPropSheetData) + cbFileInfoBuff);
    if(__argc > 1)
        _tcscpy(pData->szFileName1, __targv[1]);
    if(__argc > 2)
        _tcscpy(pData->szFileName2, __targv[2]);
    if(__argc > 3)
        _tcscpy(pData->szDirName, __targv[3]);
    if(pData->szFileName1[0] == 0)
        _tcscpy(pData->szFileName1, _T("C:\\TestFile.bin"));

    //
    // Resolve the dynamic loaded APIs
    //

    ResolveDynamicLoadedAPIs();

    //
    // To make handles obtained by NtCreateFile usable for calling ReadFile and WriteFile,
    // we have to set the FILE_SYNCHRONOUS_IO_NONALERT into CreateOptions
    // and SYNCHRONIZE into DesiredAccess.
    //

    pData->dwDesiredAccess     = GENERIC_READ | SYNCHRONIZE;
    pData->dwFileAttributes    = FILE_ATTRIBUTE_NORMAL;
    pData->dwShareAccess       = FILE_SHARE_READ;               
    pData->dwCreateOptions     = FILE_SYNCHRONOUS_IO_NONALERT;
    pData->dwObjAttrFlags      = OBJ_CASE_INSENSITIVE;
    pData->dwPageAccess        = PAGE_READONLY;
    pData->dwMapAccess         = FILE_MAP_READ;
    pData->cbFileInfoBuff      = cbFileInfoBuff;

    // Call the dialog
    FileTestDialog(NULL, pData);

    // Cleanup the TPropSheetData structure and exit
    UnloadDynamicLoadedAPIs();
    HeapFree(g_hHeap, 0, pData);
    return 0;
}

⌨️ 快捷键说明

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