www.pudn.com > Irp-Files.rar > filetool.c
#include#include #include #include #include "hexview.h" #include "ioctl.h" #include "resource.h" #pragma comment(lib, "F:\\03\\NTDDK\\libfre\\i386\\ntdll.lib") #pragma comment(lib, "comctl32.lib") #define GetBit(a, b) (a & (1 << (b - 1))) #define SetBit(a, b) (a |= 1 << (b - 1)) #define OP_COPY 1 #define OP_REPLACE 2 #define OP_DELETE 3 #define OP_UNLOCK 4 #define OP_VIEW 5 #define OP_MAXIMUM 7 #define malloc(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, s) #define free(p) HeapFree(GetProcessHeap(), 0, p) #define realloc(p, s) HeapReAlloc(GetProcessHeap(), 0, p, s) LONG NTAPI ZwQueryInformationFile( IN HANDLE FileHandle, OUT PVOID IoStatusBlock, OUT PVOID FileInformation, IN ULONG Length, IN ULONG FileInformationClass ); LONG NTAPI ZwSetInformationFile( IN HANDLE FileHandle, OUT PVOID IoStatusBlock, IN PVOID FileInformation, IN ULONG Length, IN ULONG FileInformationClass ); LONG NTAPI ZwQuerySystemInformation( IN ULONG SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); LONG NTAPI ZwQueryObject( IN HANDLE Handle, IN ULONG ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT PULONG ReturnLength OPTIONAL ); typedef struct _SYSTEM_HANDLE_INFORMATION { ULONG ProcessId; UCHAR ObjectTypeNumber; UCHAR Flags; USHORT Handle; PVOID Object; ACCESS_MASK GrantedAccess; } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; typedef struct _SYSTEM_HANDLE_INFORMATION_EX { ULONG NumberOfHandles; SYSTEM_HANDLE_INFORMATION Information[1]; } SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; typedef struct _HANDLE_DESC { ULONG Pid; ULONG Handle; ULONG DesiredAccess; LPSTR ObjectType; LPSTR ObjectName; } HANDLE_DESC, *PHANDLE_DESC; typedef BOOL (*HANDLEINFOFUNC)(PHANDLE_DESC Info, LPVOID Param); LPCSTR g_szDriverName = "drvTest"; TCHAR FileName[MAX_PATH]; DWORD OpFlags = 0; LRESULT CALLBACK DlgProc1(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK DlgProc2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK DlgProc3(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); VOID PrintLastError(LPCTSTR Prefix) { CHAR OutBuf[280]; DWORD ErrorCode; LPVOID lpMsgBuf; ErrorCode = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrorCode, 0, (LPTSTR)&lpMsgBuf, 0, NULL ); wsprintf(OutBuf, "%s Error = %d \n(%s)\n", Prefix, ErrorCode, lpMsgBuf); MessageBox(NULL, OutBuf, "ERROR!", MB_ICONERROR); LocalFree(lpMsgBuf); } BOOL InstallDriver(SC_HANDLE SCManager, LPCTSTR DriverName, LPCTSTR ServiceExe) { SC_HANDLE hSCService; hSCService = CreateService( SCManager, DriverName, DriverName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, ServiceExe, NULL, NULL, NULL, NULL, NULL); if (hSCService) { CloseServiceHandle(hSCService); return TRUE; } if (GetLastError() != ERROR_SERVICE_EXISTS) { PrintLastError("CreateService failed!"); return FALSE; } return TRUE; } BOOL RemoveDriver(SC_HANDLE SCManager, LPCTSTR DriverName) { SC_HANDLE hSCService; BOOL bResult = FALSE; hSCService = OpenService( SCManager, DriverName, SERVICE_ALL_ACCESS); if (hSCService) { bResult = DeleteService(hSCService); if (!bResult) { PrintLastError("DeleteService failed!"); } CloseServiceHandle(hSCService); } return bResult; } BOOL StartDriver(SC_HANDLE SCManager, LPCTSTR DriverName) { SC_HANDLE hSCService; BOOL bResult = FALSE; hSCService = OpenService( SCManager, DriverName, SERVICE_ALL_ACCESS); if (hSCService) { bResult = StartService(hSCService, 0, NULL) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING || GetLastError() == ERROR_SERVICE_DISABLED; if (!bResult) { PrintLastError("StartService failed!"); } CloseServiceHandle(hSCService); } return bResult; } BOOL StopDriver(SC_HANDLE SCManager, LPCTSTR DriverName) { SC_HANDLE hSCService; BOOL bResult = FALSE; SERVICE_STATUS status; hSCService = OpenService( SCManager, DriverName, SERVICE_ALL_ACCESS); if (hSCService) { bResult = ControlService( hSCService, SERVICE_CONTROL_STOP, &status); CloseServiceHandle(hSCService); } return bResult; } BOOL LoadDeviceDriver(LPCTSTR Name, LPCTSTR Path) { SC_HANDLE hSCManager; BOOL bResult = FALSE; hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { InstallDriver(hSCManager, Name, Path); bResult = StartDriver(hSCManager, Name); CloseServiceHandle(hSCManager); } return bResult; } BOOL UnloadDeviceDriver(LPCTSTR Name) { SC_HANDLE hSCManager; BOOL bResult = FALSE; hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager) { StopDriver(hSCManager, Name); bResult = RemoveDriver(hSCManager, Name); CloseServiceHandle(hSCManager); } return bResult; } BOOL OpenDevice(LPCTSTR DriverName, HANDLE *lphDevice) { TCHAR DeviceName[64]; HANDLE hDevice; TCHAR FullPath[MAX_PATH]; wsprintf(DeviceName, TEXT("\\\\.\\%s"), DriverName); hDevice = CreateFile( DeviceName, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDevice == INVALID_HANDLE_VALUE) { if (GetLastError() != ERROR_FILE_NOT_FOUND) return FALSE; GetModuleFileName(NULL, FullPath, MAX_PATH - 11); strcpy(strrchr(FullPath, '\\') + 1, "driver.sys"); //GetFullPathName("driver.sys", MAX_PATH, FullPath, NULL); LoadDeviceDriver(DriverName, FullPath); hDevice = CreateFile( DeviceName, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hDevice == INVALID_HANDLE_VALUE) return FALSE; } if (lphDevice) *lphDevice = hDevice; else CloseHandle(hDevice); return TRUE; } BOOL CallDriver(ULONG IoCode, PVOID InBuffer, ULONG InLength, PVOID OutBuffer, ULONG OutLength, PULONG BytesReturned) { HANDLE DeviceHandle; BOOL bResult; ULONG Returned; DWORD lastError; if (!OpenDevice(g_szDriverName, &DeviceHandle)) return FALSE; bResult = DeviceIoControl( DeviceHandle, IoCode, InBuffer, InLength, OutBuffer, OutLength, &Returned, NULL); lastError = GetLastError(); CloseHandle(DeviceHandle); SetLastError(lastError); if (bResult && BytesReturned != NULL) *BytesReturned = Returned; return bResult; } HANDLE ExCreateFile(LPTSTR lpName) { HANDLE hOutFile; DWORD dwErrorCode, nSize; LPVOID lpMsgBuf; PFILE_REQUEST_CREATE frc; nSize = sizeof(FILE_REQUEST_CREATE) + strlen(lpName) + 1; frc = (PFILE_REQUEST_CREATE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nSize); if (frc == NULL) return NULL; strcpy(frc->FileName, lpName); frc->CreateDisposition = FILE_OPEN; frc->DesiredAccess = GENERIC_READ | GENERIC_WRITE; frc->ShareAccess = FILE_SHARE_READ; CallDriver( IOCTL_FILE_CREATE, frc, nSize, &hOutFile, sizeof(HANDLE), NULL); dwErrorCode = GetLastError(); HeapFree(GetProcessHeap(), 0, frc); if (dwErrorCode == ERROR_SUCCESS) return hOutFile; else { FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, 0, (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox(NULL, lpMsgBuf, "ERROR", MB_ICONSTOP); LocalFree(lpMsgBuf); return NULL; } } BOOL ExReadFile(HANDLE hFile, PVOID Buffer, DWORD Length) { DWORD dwErrorCode; LPVOID lpMsgBuf; CallDriver( IOCTL_FILE_READ, &hFile, sizeof(HANDLE), Buffer, Length, NULL); dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_SUCCESS) return TRUE; else { FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, 0, (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox(NULL, lpMsgBuf, "ERROR", MB_ICONSTOP); LocalFree(lpMsgBuf); return FALSE; } } BOOL ExCopyFile(HANDLE hSourceFile, LPCTSTR lpNewFile) { HANDLE hBakFile, hMap; PBYTE pMap; DWORD i = 0, dwSize, nWriteByte; dwSize = GetFileSize(hSourceFile, NULL); if (dwSize == -1) { return FALSE; } hMap = CreateFileMapping( hSourceFile, NULL, PAGE_READONLY, 0, 0, NULL); if (hMap == NULL) { return FALSE; } pMap = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0); CloseHandle(hMap); if (pMap == NULL) { return FALSE; } hBakFile = CreateFile( lpNewFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if (hBakFile == INVALID_HANDLE_VALUE) { UnmapViewOfFile(pMap); return FALSE; } do { if (!WriteFile( hBakFile, pMap + i, dwSize - i, &nWriteByte, NULL)) { UnmapViewOfFile(pMap); CloseHandle(hBakFile); DeleteFile(lpNewFile); return FALSE; } } while ((i += nWriteByte) < dwSize); UnmapViewOfFile(pMap); CloseHandle(hBakFile); return TRUE; } BOOL ExDeleteFile(HANDLE hSourceHandle) { DWORD IoSB[2]; DWORD FileAttributes[2]; DWORD status; BOOL bResult; status = ZwQueryInformationFile( hSourceHandle, IoSB, FileAttributes, 8, 0x23); if ((int)status < 0) return FALSE; FileAttributes[0] = 1; status = ZwSetInformationFile( hSourceHandle, IoSB, FileAttributes, 1, 0x0d); if ((int)status >= 0) return TRUE; { DWORD dwReturned; HANDLE hDeviceCtl; if (!OpenDevice(g_szDriverName, &hDeviceCtl)) return FALSE; bResult = DeviceIoControl( hDeviceCtl, IOCTL_FILE_DELETE, &hSourceHandle, 4, NULL, 0, &dwReturned, NULL); CloseHandle(hDeviceCtl); } return bResult; } BOOL ExReplaceFile(HANDLE hDestFile, LPCTSTR lpSourceFile) { HANDLE hSrcFile, hMap; PBYTE pMap; DWORD i = 0, dwSize, nReadByte; hSrcFile = CreateFile( lpSourceFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hSrcFile == INVALID_HANDLE_VALUE) { return FALSE; } dwSize = GetFileSize(hSrcFile, NULL); if (dwSize == -1) { CloseHandle(hSrcFile); return FALSE; } hMap = CreateFileMapping( hDestFile, NULL, PAGE_READWRITE, 0, dwSize, NULL); if (hMap == NULL) { CloseHandle(hSrcFile); return FALSE; } pMap = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); CloseHandle(hMap); if (pMap == NULL) { CloseHandle(hSrcFile); return FALSE; } do { if (!ReadFile( hSrcFile, pMap + i, dwSize - i, &nReadByte, NULL)) { UnmapViewOfFile(pMap); CloseHandle(hSrcFile); return FALSE; } } while ((i += nReadByte) < dwSize); UnmapViewOfFile(pMap); CloseHandle(hSrcFile); return TRUE; } BOOL UnicodeToAnsi(PUNICODE_STRING SourceString, LPSTR TargetString, ULONG MaxLength) { ULONG i; if (MaxLength < (ULONG)(SourceString->Length + 1)) return FALSE; for (i = 0; i < (ULONG)(SourceString->Length + 1); i++) { TargetString[i] = (TCHAR)SourceString->Buffer[i]; } return TRUE; } BOOL ExQueryHandleInfo(PSYSTEM_HANDLE_INFORMATION HandleInfo, PVOID OutputBuffer, ULONG OutputBufferLength) { HANDLE ProcessHandle, ObjectHandle; LONG status; TCHAR Buffer[0x400]; PHANDLE_DESC HandleDesc; LPSTR Name; ULONG MaxNameLength; HandleDesc = (PHANDLE_DESC)OutputBuffer; Name = (LPSTR)OutputBuffer + sizeof(HANDLE_DESC); MaxNameLength = OutputBufferLength - sizeof(HANDLE_DESC); if (OutputBufferLength < sizeof(HANDLE_DESC)) return FALSE; HandleDesc->Pid = HandleInfo->ProcessId; HandleDesc->Handle = HandleInfo->Handle; HandleDesc->DesiredAccess = HandleInfo->GrantedAccess; ProcessHandle = OpenProcess(PROCESS_DUP_HANDLE, FALSE, HandleInfo->ProcessId); if (ProcessHandle == NULL) { return FALSE; } status = DuplicateHandle( ProcessHandle, (HANDLE)HandleInfo->Handle, GetCurrentProcess(), &ObjectHandle, 0, FALSE, DUPLICATE_SAME_ACCESS); CloseHandle(ProcessHandle); if (status == 0) { return FALSE; } status = ZwQueryObject(ObjectHandle, 2, Buffer, 0x400, NULL); if (status != 0) { CloseHandle(ObjectHandle); return FALSE; } HandleDesc->ObjectType = Name; status = UnicodeToAnsi( (PUNICODE_STRING)&Buffer, Name, MaxNameLength); if (status == FALSE) { CloseHandle(ObjectHandle); return FALSE; } MaxNameLength -= strlen(Name) + 1; Name += strlen(Name) + 1; status = ZwQueryObject(ObjectHandle, 1, Buffer, 0x400, NULL); CloseHandle(ObjectHandle); if (status != 0) { return FALSE; } HandleDesc->ObjectName = Name; status = UnicodeToAnsi( (PUNICODE_STRING)&Buffer, Name, MaxNameLength); return status; } BOOL EnumHandleInfo(HANDLEINFOFUNC Routine, LPVOID Param) { PSYSTEM_HANDLE_INFORMATION HandleList; PVOID ListBuffer; ULONG ListLength, ReadLength; LONG status; TCHAR Buffer[0x800]; ListBuffer = VirtualAlloc(NULL, 0x200000, MEM_RESERVE, PAGE_READWRITE); ListLength = 0x10000; if (ListBuffer == NULL) { MessageBox(NULL, "内存不足", "提示", MB_ICONSTOP); return FALSE; } do { VirtualAlloc(ListBuffer, ListLength += 0x8000, MEM_COMMIT, PAGE_READWRITE); status = ZwQuerySystemInformation(0x10, ListBuffer, ListLength, &ReadLength); } while (status == 0xc0000004); if (status < 0) { MessageBox(NULL, "查询系统信息失败", "错误", MB_ICONSTOP); VirtualFree(ListBuffer, 0, MEM_RELEASE); return FALSE; } HandleList = (PSYSTEM_HANDLE_INFORMATION)((PCHAR)ListBuffer + 4); ReadLength /= sizeof(SYSTEM_HANDLE_INFORMATION); for (; ReadLength--; HandleList++) { if (HandleList->ObjectTypeNumber != 0x1a) continue; if (!ExQueryHandleInfo(HandleList, Buffer, 0x800)) { continue; } if (!(*Routine)((PHANDLE_DESC)&Buffer, Param)) break; } VirtualFree(ListBuffer, 0, MEM_RELEASE); return TRUE; } BOOL MainRoutine(ULONG OpCode) { HANDLE hFile; OPENFILENAME ofn; char szFileName[MAX_PATH]; char szFileType[64]; if ((hFile = ExCreateFile(FileName)) == NULL) { MessageBox(NULL, "打开文件失败", "提示", MB_ICONERROR); return FALSE; } switch (OpCode) { case OP_COPY: memset(&ofn, 0, sizeof(OPENFILENAME)); szFileType[0] = '\0'; szFileName[0] = '\0'; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = szFileType; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY; { char *p = strrchr(FileName, '.'); if (p != NULL) { wsprintf(szFileType, "当前文件类型 (*%s)\t*%s\t", p, p); wsprintf(szFileName, "*%s", p); ofn.lpstrDefExt = p; } strcat(szFileType, "全部文件\t(*.*)\t"); p = szFileType; do { if (*p == '\t') *p = '\0'; } while (*++p); } if (GetSaveFileName(&ofn)) { if (!ExCopyFile(hFile, szFileName)) MessageBox(NULL, "复制失败", "提示", MB_ICONERROR); } break; case OP_REPLACE: memset(&ofn, 0, sizeof(OPENFILENAME)); szFileName[0] = '\0'; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.hInstance = GetModuleHandle(NULL); ofn.lpstrFilter = "全部文件\0*.*\0"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER | OFN_HIDEREADONLY; if (GetOpenFileName(&ofn)) { if (!ExReplaceFile(hFile, szFileName)) MessageBox(NULL, "替换失败", "提示", MB_ICONERROR); } break; case OP_DELETE: if (MessageBox( NULL, "确实要删除该文件吗?", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { if (!ExDeleteFile(hFile)) MessageBox(NULL, "删除失败", "提示", MB_ICONERROR); } break; case OP_UNLOCK: DialogBox( GetModuleHandle(NULL), (LPCTSTR)IDD_UNLOCK, NULL, DlgProc2); break; case OP_VIEW: InitHexViewClass(); DialogBoxParam( GetModuleHandle(NULL), (LPCTSTR)IDD_VIEW, NULL, DlgProc3, (LPARAM)hFile); break; } CloseHandle(hFile); return TRUE; } LRESULT CALLBACK DlgProc1(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: if (FileName[0] == '\0') { EnableWindow(GetDlgItem(hDlg, IDC_BUTTON1), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON2), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON3), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_BUTTON4), FALSE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BUTTON1: EndDialog(hDlg, OP_COPY); break; case IDC_BUTTON2: EndDialog(hDlg, OP_REPLACE); break; case IDC_BUTTON3: EndDialog(hDlg, OP_DELETE); break; case IDC_BUTTON4: MessageBox(hDlg, "不可用", "提示", MB_ICONSTOP); EndDialog(hDlg, 0); break; case IDC_BUTTON5: EndDialog(hDlg, OP_VIEW); break; case IDC_BUTTON7: case IDCANCEL: case IDM_EXIT: EndDialog(hDlg, 0); break; } break; default: return FALSE; } return TRUE; } VOID InitializeList(HWND hList) { LV_COLUMN lvc; DWORD dwStyle; ListView_SetColumnWidth(hList, 1, 65); lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.cx = 80; lvc.pszText = "映像名称"; ListView_InsertColumn(hList, 0, &lvc); lvc.cx = 50; lvc.pszText = "PID"; ListView_InsertColumn(hList, 1, &lvc); lvc.cx = 60; lvc.pszText = "句柄ID"; ListView_InsertColumn(hList, 2, &lvc); lvc.cx = 200; lvc.pszText = "锁定路径"; ListView_InsertColumn(hList, 3, &lvc); lvc.cx = 200; lvc.pszText = "映像路径"; ListView_InsertColumn(hList, 4, &lvc); dwStyle = ListView_GetExtendedListViewStyle(hList); dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP; ListView_SetExtendedListViewStyle(hList, dwStyle); } BOOL InsertList(PHANDLE_DESC Info, LPVOID Param) { return TRUE; } VOID UpdateList() { PVOID Buffer; Buffer = malloc(0x1000); EnumHandleInfo(InsertList, NULL); } LRESULT CALLBACK DlgProc2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HWND hList; switch (uMsg) { case WM_INITDIALOG: hList = GetDlgItem(hDlg, IDC_LIST1); InitializeList(hList); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BUTTON5: case IDCANCEL: case IDM_EXIT: EndDialog(hDlg, 0); break; } break; default: return FALSE; } return TRUE; } LRESULT CALLBACK DlgProc3(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HANDLE hMap; static PBYTE Buffer; static DWORD Length; switch (uMsg) { case WM_INITDIALOG: if ((Length = GetFileSize((HANDLE)lParam, NULL)) == -1) { break; } { DWORD temp = 0; if (ExReadFile((HANDLE)lParam, &temp, 3)) MessageBox(NULL, (void *)&temp, "read ok", 0); } if ((hMap = CreateFileMapping( (HANDLE)lParam, NULL, PAGE_READWRITE, 0, 0, NULL)) == NULL) { break; } Buffer = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0); CloseHandle(hMap); SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_SETHANDLE, (WPARAM)Length, (LPARAM)Buffer); break; case WM_CHAR: MessageBox(NULL, "dfs", "DF", 0); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: case IDM_EXIT: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_SETHANDLE, (WPARAM)0, (LPARAM)NULL); UnmapViewOfFile(Buffer); EndDialog(hDlg, 0); break; case IDM_UNDO: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_UNDO, 0, 0); break; case IDM_REDO: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_REDO, 0, 0); break; case IDM_SAVE: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_APPLYMODIFY, 0, 0); break; case IDM_COPY: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_COPY, 0, 0); break; case IDM_COPYHEX: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_COPYHEX, 0, 0); break; case IDM_SELECTALL: SendMessage(GetDlgItem(hDlg, IDC_CUSTOM1), HV_SELALL, 0, 0); break; } break; default: return FALSE; } return TRUE; } BOOL ParseCommandLine(LPTSTR lpCmdLine) { LPTSTR p; do { if (*lpCmdLine == ' ' || *lpCmdLine == '\t') continue; if (*lpCmdLine == '-') { switch (*++lpCmdLine | 0x20) { case 'c': SetBit(OpFlags, OP_COPY); break; case 'p': SetBit(OpFlags, OP_REPLACE); break; case 'd': SetBit(OpFlags, OP_DELETE); break; case 'u': SetBit(OpFlags, OP_UNLOCK); break; case 'v': SetBit(OpFlags, OP_VIEW); break; default: return FALSE; } continue; } if (*lpCmdLine == '"') { p = lpCmdLine + 1; while (*++lpCmdLine != '"') { if (*lpCmdLine == '\0') return FALSE; } } else { p = lpCmdLine; do { if (*lpCmdLine == ' ' || *lpCmdLine == '\t') break; } while (*++lpCmdLine); } if (lpCmdLine - p >= MAX_PATH) return FALSE; strncpy(FileName, p, lpCmdLine - p); if (*lpCmdLine == '\0') break; } while (*++lpCmdLine); return TRUE; } void TEST1(HWND hWnd) { DWORD dwErrorCode; LPVOID lpMsgBuf; DWORD temp1 = 0x112, temp2, temp3 = 0; static int b = 0; char buf[32]; wsprintf(buf, "%x", IOCTL_FILE_WRITE); SetWindowText(hWnd, buf); if (b == 0) { UnloadDeviceDriver(g_szDriverName); b = 1; Sleep(100); } CallDriver( IOCTL_TEST_FUNCTION, &temp1, sizeof(temp1), &temp2, sizeof(temp2), &temp3); dwErrorCode = GetLastError(); if (dwErrorCode != ERROR_SUCCESS) { FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, 0, (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox(NULL, lpMsgBuf, "ERROR", MB_ICONSTOP); LocalFree(lpMsgBuf); } else { wsprintf(buf, "I=%x O=%x R=%x", temp1, temp2, temp3); SetWindowText(hWnd, buf); } } void TEST() { HANDLE hFile = CreateFile( "C:\\Test.exe", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL); InitHexViewClass(); DialogBoxParam( GetModuleHandle(NULL), (LPCTSTR)IDD_VIEW, NULL, DlgProc3, (LPARAM)hFile); CloseHandle(hFile); ExitProcess(0); } int APIENTRY WinMain1( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { TCHAR PathName[MAX_PATH]; ULONG OpCode; /* InitHexView(); DialogBox( GetModuleHandle(NULL), (LPCTSTR)IDD_VIEW, NULL, DlgProc3); return 0; //*///TEST(); GetModuleFileName(hInstance, PathName, MAX_PATH); *strrchr(PathName, '\\') = '\0'; SetCurrentDirectory(PathName); if (!ParseCommandLine(lpCmdLine)) return -1; if (!FileName[0]) return -1; InitCommonControls(); UnloadDeviceDriver(g_szDriverName); if (FileName[0] == '\0' || OpFlags == 0) { OpCode = DialogBox( hInstance, (LPCTSTR)IDD_DIALOG, NULL, DlgProc1); if (OpCode != 0) { MainRoutine(OpCode); } } else { OpCode = 0; while (++OpCode < OP_MAXIMUM) { if (GetBit(OpFlags, OpCode)) { if (!MainRoutine(OpCode)) break;; } } } UnloadDeviceDriver(g_szDriverName); return 0; }