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