QEMU中通过GPA得到对应HVA的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leoufung/article/details/49024149

直接上代码


int kvm_get_host_virtual_addr(uint64_t paddr,
			      uint64_t *vaddr)
{
    int slot_num = ARRAY_SIZE(kvm_state->slots);
    int i;


    for (i = 0; i < slot_num; i++) {
		KVMSlot *mem = &kvm_state->slots[i];
		if (paddr >= mem->start_addr && 
	    	paddr < mem->start_addr + mem->memory_size) {
	    	*vaddr = (uint64_t)mem->ram + paddr - mem->start_addr;
	    	break;
		}
    }
    if (i == slot_num) {
		fprintf(stderr, "fail to find target physical addr(%ld) in KVM memory range",
			paddr);
		return 1;
    }
    return 0;
}


展开阅读全文

如何通过HWND得到对应的ICON ?

01-29

通常我用这行代码获得Window的ICONrnHICON hIcon = (HICON)GetClassLong(hwnd, GCL_HICON);rnrn在大多数情况下,这行代码工作很正常,但有时获得的图标是不正确的。rnrn例如:rnWindows XP中可以方便的定制文件夹,为文件夹指定一个特别的图标。当打开这个文件夹时,窗口的ICON就变成了指定的ICON。而用上面的代码获得ICON仍然是默认的文件夹图标。rnrn而且我发现有些用Delphi写的程序用上面的代码获得的HICON是NULL,所以我采用下面的方法来获取图标。rnrn1) 首先获得程序文件的EXE文件名:rnrn// 自己编写的函数rnGetProcessFilename(hwnd, szbuf, MAX_PATH);rnrnrn2) 然后用SHGetFileInfo获取这个EXE文件的图标:rnrnSHFILEINFO shfi;rnZeroMemory(&shfi, sizeof(shfi));rnDWORD dwret = SHGetFileInfo(szbuf, 0, &shfi, sizeof(shfi), rn SHGFI_ICON | SHGFI_ICONLOCATION | SHGFI_LARGEICON);rnhIcon = shfi.hIcon;rnrn附:GetProcessFilename实现rnrn// 函数名 :GetProcessFilenamern// 描述 :通过窗口句柄获得创建窗口的应用程序的可执行文件名rn// NOTE: 部分代码改编自 MSDN 知识库文章 Q175030 的 EnumProcs 函数rn// 返回类型 :BOOL - 指示是否成功rn// 参数 :HWND hwnd [in] - 窗口句柄rn// 参数 :LPTSTR lpszFilename [ptr] - 存放文件名的缓冲区rn// 参数 :UINT nBufLen [in] - 缓冲区长度,TCHARsrnrnBOOL GetProcessFilename(HWND hwnd, LPTSTR lpszFilename, UINT nBufLen)rnrn BOOL bSuccess = TRUE;rnrn // 通过进程ID获得进程的HANDLErn DWORD dwProcessID;rn GetWindowThreadProcessId(hwnd, &dwProcessID);rn HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessID);rn if(hProcess == NULL) return FALSE;rnrn // 获取Windows版本信息rn OSVERSIONINFO osver;rn osver.dwOSVersionInfoSize = sizeof(osver);rn GetVersionEx(&osver);rnrn // 根据Win32平台的不同,这个函数的实现有所不同。rn if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT)rn rn // Windows NT 平台下的实现rn // 首先通过 EnumProcessModules 函数枚举出 process 的第一个 modulern // (这个 module 总是 .EXE 文件),然后用 GetModuleFileNameEx 获取 .EXE 的文件名rn // NOTE: 之所以不通过直接联接PSAPI.LIB是为了消除程序运行于rn // Windows 9x操作系统时显示的警告信息。rnrn HINSTANCE hInstLib; // PSAPI.DLL的实例句柄rnrn hInstLib = LoadLibraryA("PSAPI.DLL");rn if(hInstLib == NULL) return FALSE;rnrn // PSAPI function pointers;rn BOOL (WINAPI* lpfEnumProcessModules)(HANDLE, HMODULE*, DWORD, LPDWORD);rn DWORD (WINAPI* lpfGetModuleFileNameEx)(HANDLE, HMODULE, LPTSTR, DWORD);rnrn // Get procedure addresses.rn lpfEnumProcessModules = (BOOL(WINAPI*)(HANDLE, HMODULE*, DWORD, LPDWORD))rn GetProcAddress(hInstLib, TEXT("EnumProcessModules"));rnrn lpfGetModuleFileNameEx = (DWORD(WINAPI*)(HANDLE, HMODULE, LPTSTR, DWORD))rn GetProcAddress(hInstLib, TEXT("GetModuleFileNameExA"));rnrn if(lpfEnumProcessModules == NULL || lpfGetModuleFileNameEx == NULL)rn rn FreeLibrary(hInstLib);rn return FALSE;rn rnrn HMODULE hModule;rn DWORD dwArraySize;rn if(lpfEnumProcessModules(hProcess, &hModule, rn sizeof(hModule), &dwArraySize))rn rn if(!lpfGetModuleFileNameEx(hProcess, hModule, rn lpszFilename, nBufLen))rn rn lpszFilename[0] = 0;rn bSuccess = FALSE;rn rn rn elsern rn bSuccess = FALSE;rn rnrn FreeLibrary(hInstLib);rn rn else if(osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)rn rn // Windows 9x 平台下的实现rn HINSTANCE hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);rn if(!GetModuleFileName(hInst, lpszFilename, nBufLen)) rn bSuccess = FALSE;rn rn return bSuccess;rnrnrnrnrn======================================rnrn现在的问题是上面两种方法都不能获得自定义文件夹的图标,不知道哪位高手愿意指点一二?rnrn我的联系方式: rnOICQ - 9254671rnWindows Messenger - dualface@msn.comrn 论坛

没有更多推荐了,返回首页