📄 winmain.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 + -