📄 page05ntcreate.cpp
字号:
CreateOptionsData.nIDTitle = IDS_CREATE_OPTIONS;
CreateOptionsData.dwFlags = DlgText2Hex32(hDlg, IDC_CREATE_OPTIONS);
CreateOptionsData.nFlags = sizeof(CreateOptionsValues) / sizeof(TFlagInfo);
CreateOptionsData.Flags = CreateOptionsValues;
FlagsDialog(&CreateOptionsData);
Hex2DlgText32(hDlg, IDC_CREATE_OPTIONS, CreateOptionsData.dwFlags);
return TRUE;
}
static int OnObjAtributesFlags(HWND hDlg)
{
TFlagDialogData ObjAttrFlagsData;
ObjAttrFlagsData.hParent = hDlg;
ObjAttrFlagsData.nIDTitle = IDS_OBJECT_ATTRIBUTES_FLAGS;
ObjAttrFlagsData.dwFlags = DlgText2Hex32(hDlg, IDC_OBJ_ATTR_FLAGS);
ObjAttrFlagsData.nFlags = sizeof(CreateOptionsValues) / sizeof(TFlagInfo);
ObjAttrFlagsData.Flags = ObjAttrFlagsValues;
FlagsDialog(&ObjAttrFlagsData);
Hex2DlgText32(hDlg, IDC_OBJ_ATTR_FLAGS, ObjAttrFlagsData.dwFlags);
return TRUE;
}
static int OnCreateDispositionChanged(HWND hDlg)
{
DWORD dwCreateDisposition;
DWORD dwCreateOptions = DlgText2Hex32(hDlg, IDC_CREATE_OPTIONS);
HWND hCombo = GetDlgItem(hDlg, IDC_CREATE_DISPOSITION);
dwCreateOptions &= 0x00FFFFFF;
dwCreateDisposition = ComboBox_GetCurSel(hCombo);
dwCreateOptions |= (dwCreateDisposition << 24);
Hex2DlgText32(hDlg, IDC_CREATE_OPTIONS, dwCreateOptions);
return TRUE;
}
static int OnOpenFileClick(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
OBJECT_ATTRIBUTES ObjAttr;
IO_STATUS_BLOCK IoStatus;
UNICODE_STRING FileName;
UNICODE_STRING DirName;
NTSTATUS Status = STATUS_SUCCESS;
HANDLE SaveTransactionHandle = NULL;
if(IsHandleValid(pData->hFile))
{
MessageBoxRc(hDlg, IDS_WARNING, IDS_FILE_ALREADY_OPEN);
return TRUE;
}
// Get the various create options
SaveDialog(hDlg);
// Id we required opening by ID and it is not there, do nothing
if(pData->szDirName[0] == 0 && (pData->dwCreateOptions & FILE_OPEN_BY_FILE_ID))
{
MessageBoxRc(hDlg, IDS_ERROR, IDS_OPEN_BY_ID_HINT);
return TRUE;
}
if(pData->bUseTransaction && pfnRtlSetCurrentTransaction != NULL)
{
SaveTransactionHandle = pfnRtlGetCurrentTransaction();
pfnRtlSetCurrentTransaction(pData->hTransaction);
}
// Open the directory (If any)
if(pData->szDirName[0] != 0)
{
INIT_UNICODE_STRING(DirName, pData->szDirName);
InitializeObjectAttributes(&ObjAttr, &DirName, pData->dwObjAttrFlags, 0, NULL);
Status = NtCreateFile(&pData->hDirectory,
FILE_READ_DATA,
&ObjAttr,
&IoStatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
0,
NULL,
0);
if(!NT_SUCCESS(Status))
{
MessageBoxRc(hDlg, IDS_ERROR, IDS_E_OPENDIR, NtStatus2Text(Status), Status);
return TRUE;
}
}
// Prepare the file open
if(NT_SUCCESS(Status))
{
INIT_UNICODE_STRING(FileName, pData->szFileName1);
// If open by ID required, set the ID to the string
if(pData->dwCreateOptions & FILE_OPEN_BY_FILE_ID)
{
if(ConvertStringToFileID(hDlg, IDC_FILE_NAME, FileName) != ERROR_SUCCESS)
return TRUE;
}
ZeroMemory(&IoStatus, sizeof(IO_STATUS_BLOCK));
InitializeObjectAttributes(&ObjAttr, &FileName, pData->dwObjAttrFlags, pData->hDirectory, NULL);
Status = NtCreateFile(&pData->hFile,
pData->dwDesiredAccess,
&ObjAttr,
&IoStatus,
&pData->liAllocationSize,
pData->dwFileAttributes,
pData->dwShareAccess,
pData->dwCreateDisposition,
(pData->dwCreateOptions & 0x00FFFFFF),
NULL,
0);
SetNtOperationResult(hDlg, Status, &IoStatus);
}
if(pData->bUseTransaction && pfnRtlSetCurrentTransaction != NULL)
{
pfnRtlSetCurrentTransaction(SaveTransactionHandle);
SaveTransactionHandle = NULL;
}
return TRUE;
}
static int OnNtCloseClick(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
NTSTATUS Status = STATUS_SUCCESS;
if(IsHandleValid(pData->hFile))
Status = NtClose(pData->hFile);
if(IsHandleValid(pData->hDirectory))
NtClose(pData->hDirectory);
pData->hDirectory = pData->hFile = NULL;
SetNtOperationResult(hDlg, Status, NULL);
return TRUE;
}
static int OnInitDialog(HWND hDlg, LPARAM lParam)
{
TPropSheetData * pData;
PROPSHEETPAGE * pPage = (PROPSHEETPAGE *)lParam;
HWND hCombo = GetDlgItem(hDlg, IDC_CREATE_DISPOSITION);
SetWindowLongPtr(hDlg, DWLP_USER, (LONG)pPage->lParam);
pData = (TPropSheetData *)pPage->lParam;
pData->dwCreateDisposition = FILE_OPEN;
// Initialize the combo box
InitDialogControls(hDlg, MAKEINTRESOURCE(IDD_PAGE05_NTCREATE));
if(hCombo != NULL)
ComboBox_SetCurSel(hCombo, FILE_OPEN);
return TRUE;
}
static int OnSetActive(HWND hDlg)
{
TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
ULONG dwCreateOptions = pData->dwCreateOptions | (pData->dwCreateDisposition << 24);
BOOL bEnabled = FALSE;
// Set directory name and file name
SetDlgItemText(hDlg, IDC_RELATIVE_FILE, pData->szDirName);
ConvertToNtName(hDlg, IDC_RELATIVE_FILE);
SetDlgItemText(hDlg, IDC_FILE_NAME, pData->szFileName1);
ConvertToNtName(hDlg, IDC_FILE_NAME);
// Set the various create options
Hex2DlgText32(hDlg, IDC_DESIRED_ACCESS, pData->dwDesiredAccess);
Hex2DlgText64(hDlg, IDC_ALLOCATION_SIZE, pData->liAllocationSize);
Hex2DlgText32(hDlg, IDC_FILE_ATTRIBUTES, pData->dwFileAttributes);
Hex2DlgText32(hDlg, IDC_SHARE_ACCESS, pData->dwShareAccess);
Hex2DlgText32(hDlg, IDC_CREATE_OPTIONS, dwCreateOptions);
Hex2DlgText32(hDlg, IDC_OBJ_ATTR_FLAGS, pData->dwObjAttrFlags);
// Enable/disable transaction
if(pfnRtlSetCurrentTransaction != NULL && IsHandleValid(pData->hTransaction))
bEnabled = TRUE;
EnableDlgItems(hDlg, bEnabled, IDC_TRANSACTED, 0);
if(bEnabled)
CheckDlgButton(hDlg, IDC_TRANSACTED, pData->bUseTransaction);
SetNtOperationResult(hDlg, 0, NULL);
return TRUE;
}
static int OnKillActive(HWND hDlg)
{
SaveDialog(hDlg);
return TRUE;
}
static int OnDeltaPos(HWND hDlg, NMUPDOWN * pNMUpDown)
{
LARGE_INTEGER liAllocSize;
liAllocSize = DlgText2Hex64(hDlg, IDC_ALLOCATION_SIZE);
liAllocSize.QuadPart -= pNMUpDown->iDelta * 0x100;
if(liAllocSize.QuadPart < 0)
liAllocSize.QuadPart = 0;
Hex2DlgText64(hDlg, IDC_ALLOCATION_SIZE, liAllocSize);
return TRUE;
}
static int OnCommand(HWND hDlg, UINT nNotify, UINT nIDCtrl)
{
if(nNotify == BN_CLICKED)
{
switch(nIDCtrl)
{
case IDC_BROWSE_DIR:
return OnBrowseDirClick(hDlg);
case IDC_BROWSE_FILE:
return OnBrowseFileClick(hDlg);
case IDC_BROWSE_DESIRED_ACCESS:
return OnDesiredAccessClick(hDlg);
case IDC_BROWSE_FILE_ATTRIBUTES:
return OnFileAttributesClick(hDlg);
case IDC_BROWSE_SHARE_ACCESS:
return OnShareAccessClick(hDlg);
case IDC_BROWSE_CREATE_OPTIONS:
return OnCreateOptionsClick(hDlg);
case IDC_BROWSE_OBJ_ATTR_FLAGS:
return OnObjAtributesFlags(hDlg);
case IDC_OPEN_FILE:
return OnOpenFileClick(hDlg);
case IDC_NTCLOSE:
return OnNtCloseClick(hDlg);
}
}
if(nNotify == EN_KILLFOCUS || nNotify == EN_SETFOCUS)
{
if(nIDCtrl == IDC_RELATIVE_FILE || nIDCtrl == IDC_FILE_NAME)
{
ConvertToNtName(hDlg, nIDCtrl);
return TRUE;
}
}
if(nNotify == CBN_SELCHANGE)
{
if(nIDCtrl == IDC_CREATE_DISPOSITION)
OnCreateDispositionChanged(hDlg);
}
return FALSE;
}
static int OnNotify(HWND hDlg, NMHDR * pNMHDR)
{
switch(pNMHDR->code)
{
case PSN_SETACTIVE:
return OnSetActive(hDlg);
case PSN_KILLACTIVE:
return OnKillActive(hDlg);
case UDN_DELTAPOS:
return OnDeltaPos(hDlg, (NMUPDOWN *)pNMHDR);
}
return FALSE;
}
//-----------------------------------------------------------------------------
// Public functions
INT_PTR CALLBACK PageProc05(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
return OnInitDialog(hDlg, lParam);
case WM_COMMAND:
return OnCommand(hDlg, HIWORD(wParam), LOWORD(wParam));
case WM_NOTIFY:
return OnNotify(hDlg, (NMHDR *)lParam);
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -