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

📄 page05ntcreate.cpp

📁 This ZIP archive includes the sources (and executable) for the FileTest utility, written by Ladisla
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -