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

📄 page02readfile.cpp

📁 This ZIP archive includes the sources (and executable) for the FileTest utility, written by Ladisla
💻 CPP
字号:
/*****************************************************************************/
/* Page02ReadFile.cpp                     Copyright (c) Ladislav Zezula 2004 */
/*---------------------------------------------------------------------------*/
/* This module handles both "ReadFile" and "WriteFile" pages                 */
/*---------------------------------------------------------------------------*/
/*   Date    Ver   Who  Comment                                              */
/* --------  ----  ---  -------                                              */
/* 06.03.04  1.00  Lad  The first version of Page02ReadFile.cpp              */
/*****************************************************************************/

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

//-----------------------------------------------------------------------------
// Message handlers

static int OnInitDialog(HWND hDlg, LPARAM lParam)
{
    PROPSHEETPAGE * pPage = (PROPSHEETPAGE *)lParam;
    LARGE_INTEGER LargeValue = {0};

    SetWindowLongPtr(hDlg, DWLP_USER, (LONG)pPage->lParam);
    Hex2DlgText64(hDlg, IDC_FILE_POSITION, LargeValue);
    Hex2DlgText32(hDlg, IDC_DATA_LENGTH, 0x10000);
    
    LargeValue.HighPart = 1;
    Hex2DlgText64(hDlg, IDC_FILE_SIZE, LargeValue);
    return TRUE;
}

static int OnSetActive(HWND hDlg)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    BOOL bEnable = FALSE;

    if(IsHandleValid(pData->hFile))
        bEnable = TRUE;

    EnableWindow(GetDlgItem(hDlg, IDC_READFILE), bEnable);
    EnableWindow(GetDlgItem(hDlg, IDC_WRITEFILE), bEnable);

    return TRUE;
}

static int OnDeltaPos(HWND hDlg, NMUPDOWN * pNMUpDown)
{
    LARGE_INTEGER FilePos = {0};
    DWORD dwDataLength = 0;

    if(pNMUpDown->hdr.idFrom == IDC_SPIN_FILEPOS)
    {
        FilePos = DlgText2Hex64(hDlg, IDC_FILE_POSITION);
        FilePos.QuadPart -= pNMUpDown->iDelta * 0x100;
        if(FilePos.QuadPart < 0)
            FilePos.QuadPart = 0;
        Hex2DlgText64(hDlg, IDC_FILE_POSITION, FilePos);
    }

    if(pNMUpDown->hdr.idFrom == IDC_SPIN_DATALEN)
    {
        dwDataLength = DlgText2Hex32(hDlg, IDC_DATA_LENGTH);
        dwDataLength -= pNMUpDown->iDelta * 0x1000;
        if((int)dwDataLength < 0)
            dwDataLength = 0;
        Hex2DlgText32(hDlg, IDC_DATA_LENGTH, dwDataLength);
    }
    return TRUE;
}

static int OnTransferFileClick(HWND hDlg, BOOL bRead)
{
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    LARGE_INTEGER Position = {0};
    DWORD dwTransferred = 0;
    DWORD dwToTransfer = 0;
    HWND  hCheck = GetDlgItem(hDlg, IDC_INCREASE_FILEPOS);
    BYTE * pbBuffer = NULL;
    int nError = ERROR_SUCCESS;

    // Get the start position
    if(nError == ERROR_SUCCESS)
    {
        Position     = DlgText2Hex64(hDlg, IDC_FILE_POSITION);
        dwToTransfer = DlgText2Hex32(hDlg, IDC_DATA_LENGTH);
    }

    // Allocate space
    if(nError == ERROR_SUCCESS)
    {
        pbBuffer = (BYTE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwToTransfer + 1);
        if(pbBuffer == NULL)
            nError = GetLastError();
    }

    // When write operation, fill the memory space with some dummy data
    if(nError == ERROR_SUCCESS)
    {
        if(bRead != FALSE)
        {
            // Perform the read
            SetFilePointer(pData->hFile, Position.LowPart, &Position.HighPart, FILE_BEGIN);
            if(ReadFile(pData->hFile, pbBuffer, dwToTransfer, &dwTransferred, NULL) == 0)
                nError = GetLastError();
            SetDlgItemTextA(hDlg, IDC_FILE_DATA, (char *)pbBuffer);
        }
        else
        {
            PDWORD pdwTemp = (PDWORD)pbBuffer;
            DWORD dwOctets = dwToTransfer / 8;
            DWORD dwRest   = dwToTransfer % 8;
            DWORD dwTemp   = 0;

            // First, fill the buffer with some dummy data
            for(dwTemp = 0; dwTemp < dwOctets; dwTemp++)
            {
                *pdwTemp++ = 'DAAB';
                *pdwTemp++ = 'D00F';
            }
            memcpy(pdwTemp, "BAADF00D", dwRest);

            // Perform the write
            SetFilePointer(pData->hFile, Position.LowPart, &Position.HighPart, FILE_BEGIN);
            if(WriteFile(pData->hFile, pbBuffer, dwToTransfer, &dwTransferred, NULL) == 0)
                nError = GetLastError();
        }
    }

    SetDlgItemInt(hDlg, IDC_BYTES_TRANSFERRED, dwTransferred, FALSE);
    SetLastErrorText(hDlg, IDC_LAST_ERROR, nError);

    if(pbBuffer != NULL)
        HeapFree(GetProcessHeap(), 0, pbBuffer);

    if(Button_GetCheck(hCheck) == BST_CHECKED)
    {
        Position.QuadPart += dwTransferred;
        Hex2DlgText64(hDlg, IDC_FILE_POSITION, Position);
    }
    return TRUE;
}

static int OnSetFileSizeClick(HWND hDlg)
{
    LARGE_INTEGER NewFileSize = DlgText2Hex64(hDlg, IDC_FILE_SIZE);
    TPropSheetData * pData = (TPropSheetData *)GetWindowLongPtr(hDlg, DWLP_USER);
    int nError = ERROR_SUCCESS;

    if(SetFilePointer(pData->hFile, NewFileSize.LowPart, &NewFileSize.HighPart, FILE_BEGIN) == INVALID_FILE_SIZE)
        nError = GetLastError();

    if(!SetEndOfFile(pData->hFile))
        nError = GetLastError();

    SetLastErrorText(hDlg, IDC_LAST_ERROR, nError);
    return TRUE;
}

static int OnCommand(HWND hDlg, UINT nNotify, UINT nIDCtrl)
{
    if(nNotify == BN_CLICKED)
    {
        switch(nIDCtrl)
        {
            case IDC_READFILE:
                return OnTransferFileClick(hDlg, TRUE);

            case IDC_WRITEFILE:
                return OnTransferFileClick(hDlg, FALSE);

            case IDC_SET_FILE_SIZE:
                return OnSetFileSizeClick(hDlg);
        }
    }
    return FALSE;
}

static int OnNotify(HWND hDlg, NMHDR * pNMHDR)
{
    switch(pNMHDR->code)
    {
        case PSN_SETACTIVE:
            return OnSetActive(hDlg);

        case UDN_DELTAPOS:
            return OnDeltaPos(hDlg, (NMUPDOWN *)pNMHDR);
    }
    return FALSE;
}

//-----------------------------------------------------------------------------
// Public functions

INT_PTR CALLBACK PageProc02(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 + -