static int OnCommand(HWND hDlg, UINT nNotify, UINT nIDCtrl) { if(nNotify == BN_CLICKED) { switch(nIDCtrl) { case IDC_DESIRED_ACCESS_BROWSE: return OnDesiredAccessBrowse(hDlg); case IDC_ALLOCATION_ATTRIBUTES_BROWSE: return OnAllocAttributesBrowse(hDlg); case IDC_ALLOCATION_TYPE_BROWSE: return OnAllocTypeBrowse(hDlg); case IDC_NTCREATE_SECTION: case IDC_NTOPEN_SECTION: return OnNtCreateSectionClick(hDlg, nIDCtrl); case IDC_NTCLOSE: return OnNtCloseClick(hDlg); case IDC_MAP_VIEW: return OnMapViewClick(hDlg); case IDC_DATA_EDITOR: return OnDataEditor(hDlg); case IDC_UNMAP_VIEW: return OnUnmapViewClick(hDlg); } } return FALSE; }
static int OnNtCreateSectionClick(HWND hDlg, UINT nIDCtrl) { TFileTestData * pData = GetDialogData(hDlg); POBJECT_ATTRIBUTES pObjectAttributes = NULL; OBJECT_ATTRIBUTES ObjAttr; UNICODE_STRING SectionName; NTSTATUS Status; HANDLE FileHandle = NULL; // Close the section, if already open if(IsHandleValid(pData->hSection)) OnNtCloseClick(hDlg); // Get the values from dialog controls to the dialog data if(SaveDialog1(hDlg) != ERROR_SUCCESS) return FALSE; // Format the object attributes if(pData->szSectionName[0] != 0) { InitializeObjectAttributes(&ObjAttr, &SectionName, OBJ_CASE_INSENSITIVE, NULL, NULL); RtlInitUnicodeString(&SectionName, pData->szSectionName); pObjectAttributes = &ObjAttr; } // Get the file handle for it if(IsHandleValid(pData->hFile)) FileHandle = pData->hFile; // Either create a section or open one if(nIDCtrl == IDC_NTCREATE_SECTION) { Status = NtCreateSection(&pData->hSection, pData->dwSectDesiredAccess, pObjectAttributes, &pData->MaximumSize, pData->dwSectPageProtection, pData->dwSectAllocAttributes, FileHandle); } else { Status = NtOpenSection(&pData->hSection, pData->dwSectDesiredAccess, pObjectAttributes); } // Set the result info SetResultInfo(hDlg, Status, pData->hSection); UpdateDialog(hDlg, pData); return TRUE; }
static int OnCommand(HWND hDlg, UINT nNotify, UINT nIDCtrl) { if(nNotify == BN_CLICKED) { switch(nIDCtrl) { case IDC_RELATIVE_FILE_HELP: return OnRelativeFileHelp(hDlg); case IDC_DIRECTORY_NAME_BROWSE: return OnBrowseDirClick(hDlg); case IDC_FILE_NAME_BROWSE: return OnBrowseFileClick(hDlg); case IDC_OBJ_ATTR_FLAGS_BROWSE: return OnObjAtributesFlags(hDlg); case IDC_DESIRED_ACCESS_BROWSE: return OnDesiredAccessClick(hDlg); case IDC_FILE_ATTRIBUTES_BROWSE: return OnFileAttributesClick(hDlg); case IDC_SHARE_ACCESS_BROWSE: return OnShareAccessClick(hDlg); case IDC_CREATE_OPTIONS_BROWSE: return OnCreateOptionsClick(hDlg); case IDC_EXTENDED_ATTRIBUTES_EDIT: return OnEditEaClick(hDlg); case IDC_VIRTUALIZATION: return OnVirtualization(hDlg); case IDC_PRIVILEGES: PrivilegesDialog(hDlg); return TRUE; case IDC_MAKE_DIRECTORY: return OnMakeDirectoryClick(hDlg); case IDC_RDWR_ASYNC: return QuickAccessSelection(hDlg, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, false); case IDC_RDWR_SYNC: return QuickAccessSelection(hDlg, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, true); case IDC_READ_ASYNC: return QuickAccessSelection(hDlg, GENERIC_READ, FILE_SHARE_READ, false); case IDC_READ_SYNC: return QuickAccessSelection(hDlg, GENERIC_READ, FILE_SHARE_READ, true); case IDC_QUERY_INFO_ASYNC: return QuickAccessSelection(hDlg, FILE_READ_ATTRIBUTES, 0, false); case IDC_QUERY_INFO_SYNC: return QuickAccessSelection(hDlg, FILE_READ_ATTRIBUTES, 0, true); case IDC_DELETE_ON_CLOSE: return QuickAccessSelection(hDlg, DELETE, 0, false); case IDC_CREATE_FILE: return OnCreateFileClick(hDlg); case IDC_CLOSE_HANDLE: return OnNtCloseClick(hDlg); } } // Convert the directory/file name to the NT name, if needed // Removed: Keep it as it is. We want to test NtCreateFile // with whatever the user entered. // if(nNotify == EN_KILLFOCUS) // { // if(nIDCtrl == IDC_DIRECTORY_NAME) // ConvertToNtName(hDlg, nIDCtrl); // if(nIDCtrl == IDC_FILE_NAME && GetWindowTextLength(GetDlgItem(hDlg, IDC_DIRECTORY_NAME)) == 0) // ConvertToNtName(hDlg, nIDCtrl); // return TRUE; // } return FALSE; }
static int OnCreateFileClick(HWND hDlg) { TFileTestData * pData = GetDialogData(hDlg); OBJECT_ATTRIBUTES ObjAttr; IO_STATUS_BLOCK IoStatus; UNICODE_STRING FileName; UNICODE_STRING DirName; LARGE_INTEGER AllocationSize; NTSTATUS Status = STATUS_SUCCESS; HANDLE SaveTransactionHandle = NULL; TCHAR szFileName[MAX_NT_PATH]; TCHAR szDirName[MAX_NT_PATH]; DWORD cbObjectID = 0; BYTE ObjectID[0x10]; // Close the handle, if already open if(IsHandleValid(pData->hDirectory) || IsHandleValid(pData->hFile)) OnNtCloseClick(hDlg); // Get the various create options if(SaveDialog(hDlg) != ERROR_SUCCESS) return FALSE; if(pData->bUseTransaction && pfnRtlSetCurrentTransaction != NULL) { SaveTransactionHandle = pfnRtlGetCurrentTransaction(); pfnRtlSetCurrentTransaction(pData->hTransaction); } // Get the directory name from the dialog data StringCchCopy(szDirName, _countof(szDirName), pData->szDirName); StringCchCopy(szFileName, _countof(szFileName), pData->szFileName1); // If we are about to open a file by ID, and we have no relative directory, // try to take the directory from the file name if(szDirName[0] == 0 && (pData->dwCreateOptions & FILE_OPEN_BY_FILE_ID)) { LPTSTR szFullName = pData->szFileName1; LPTSTR szFileId = _tcsrchr(szFullName, _T('\\')); size_t nLength = szFileId - szFullName + 1; if(szFileId != NULL) { StringCchCopy(szDirName, nLength, szFullName); StringCchCopy(szFileName, _countof(szFileName), szFileId + 1); } } // Open the relative file (if any) if(szDirName[0] != 0) { RtlInitUnicodeString(&DirName, szDirName); InitializeObjectAttributes(&ObjAttr, &DirName, pData->dwObjAttrFlags, 0, NULL); Status = NtOpenFile(&pData->hDirectory, pData->dwDesiredAccessRF, &ObjAttr, &IoStatus, pData->dwShareAccessRF, pData->dwOpenOptionsRF); if(!NT_SUCCESS(Status)) { SetResultInfo(hDlg, Status, NULL, IoStatus.Information); return TRUE; } } // Prepare the file open if(NT_SUCCESS(Status)) { RtlInitUnicodeString(&FileName, szFileName); // If open by ID required, set the ID to the string if(pData->dwCreateOptions & FILE_OPEN_BY_FILE_ID) { // Convert object ID to binary value if(StringToFileID(szFileName, NULL, ObjectID, &cbObjectID) != ERROR_SUCCESS) return TRUE; // Set the object ID to the UNICODE_STRING FileName.MaximumLength = FileName.Length = (USHORT)cbObjectID; FileName.Buffer = (PWSTR)ObjectID; } ZeroMemory(&IoStatus, sizeof(IO_STATUS_BLOCK)); InitializeObjectAttributes(&ObjAttr, &FileName, pData->dwObjAttrFlags, pData->hDirectory, NULL); AllocationSize.QuadPart = (LONGLONG)pData->AllocationSize; // Invoke breakpoint if the user wants to if(IsDlgButtonChecked(hDlg, IDC_BREAKPOINT) == BST_CHECKED) DebugBreak(); Status = NtCreateFile(&pData->hFile, pData->dwDesiredAccess, &ObjAttr, &IoStatus, &AllocationSize, pData->dwFileAttributes, pData->dwShareAccess, pData->dwCreateDisposition2, pData->dwCreateOptions, pData->pFileEa, pData->dwEaSize); SetResultInfo(hDlg, Status, pData->hFile, IoStatus.Information); // If this operation failed, we close the directory as well if(!NT_SUCCESS(Status) && pData->hDirectory != NULL) { NtClose(pData->hDirectory); pData->hDirectory = NULL; } } if(pData->bUseTransaction && pfnRtlSetCurrentTransaction != NULL) { pfnRtlSetCurrentTransaction(SaveTransactionHandle); SaveTransactionHandle = NULL; } return TRUE; }