Articles of x86

应该使用“__imp__ApiName @ N”还是“_ApiName @ N”?

我已经用DUMPBIN转储了一个Windows SDK .lib文件(kernel32.lib),输出显示每个API名称有两个“版本”,例如: _ imp _ExitProcess @ 4 和 _ExitProcess @ 4 那么,为什么有两个相同的不同名称? 。 假设我想从NASM调用ExitProcess,那么我们应该在声明EXTERN时使用他们,mi实践告诉我,我可以调用他们中的任何一个,但是我不知道哪一个是“正确”或“优先”坚持下去

为什么Windows团队复制“Program Files”文件夹以支持x86和x64?

经常困惑我的问题是为什么Windows团队决定复制Program Files文件夹以支持32位和64位平台? 这从长远来看不会为每个人带来更多的工作和混乱吗? 什么是让他们复制树的关键因素,而其他一些系统保持一个“程序文件”目录(有点像MAC的通用二进制格式http://en.wikipedia.org/wiki/Universal_binary )? 我相信有一个很好的理由让他们创build这个“Program Files(x86)”文件夹,如果有人在房间里,当这个决定,请分享:)

奇怪的行为与一个简单的MASM32程序

我想写一个类似于下面的C ++程序的MASM程序: #include <Windows.h> #include <iostream> typedef UINT (_stdcall *FuncPtr)(LPCSTR lpCmdLine, UINT uCmdShow); int main(void) { HMODULE hDll = LoadLibrary(TEXT("Kernel32.dll")); FuncPtr func_addr = reinterpret_cast<FuncPtr>(GetProcAddress(hDll, "WinExec")); (*func_addr)("C:\\WINDOWS\\system32\\calc.exe", SW_SHOWDEFAULT); FreeLibrary(hDll); return (0); } 正如你所看到的,这段代码执行微软计算器。 我只是想使用MASM做同样的事情,但执行失败。 这是MASM源代码: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib […]

页面文件中物理页面和页面之间的关系是什么?

在Windows下,内核可以将物理内存页交换到页面文件中的页面。 为了简单起见,我们假设只有一个分页文件。 据我所知,分页文件由具有相同大小的物理内存页面的页面组成。 即4K。 我只是好奇: 内核如何知道分页文件中的哪个页面可以自由存储? (在这里释放意味着分页文件中的页面以前不存储另一个物理内存页面。)

x86:在堆栈上压入一个特定的指针指向string时可能debugging中断?

我正在debugging我没有源代码的第三方DLL。 该DLL维护一个string池。 我想捕捉这些string之一传入函数的最早发生…任何函数… 换句话说,我想要检测什么时候将具有特定格式的指针指向一个空终止的string被压入堆栈…被任何人发现,并且当这种情况发生时我想执行一个debugging中断。 我知道你可以设置一个“break-on-access”断点,当CPU读/写/执行一个特定的地址的时候会触发这个断点。 我想要的是类似于这个:对于每个string推入堆栈,我想testing一个特定的格式,如果匹配,执行中断。 使用WinDbg,OllyDb,VS2008,任何..任何想法? 谢谢!

variables获取Windows目录在x64位版本?

在Windows的x64位版本中,我看到这也是x86位目录。 我们如何使用envirnomentvariables?

当我们将一块硬件插入计算机系统时会发生什么?

当我们将一块硬件插入计算机系统时,比方说一个网卡(网卡)或一个声卡,机箱底下会发生什么事情,以便我们使用那块硬件? 我可以想到以下两种情况,纠正我,如果我错了。 如果硬件有自己的内存芯片, 有人会安排一系列地址空间来映射这些内存芯片。 如果硬件没有自己的存储芯片, 有人会在计算机系统的主存储器中分配一定范围的地址来容纳该硬件。 我不确定前面提到的人是操作系统还是CPU。 还有一个问题:硬件总是需要一些内存来工作吗? 我对吗? 非常感谢。

Windows(x86)程序集将空终止符附加到input的string

我目前正试图追加一个空终止符到(a?)用户input的string: .386 .model flat, stdcall WriteFile PROTO STDCALL:DWORD, :PTR, :DWORD, :PTR DWORD, :PTR OVERLAPPED ReadFile PROTO STDCALL:DWORD, :PTR, :DWORD, :PTR DWORD, :PTR OVERLAPPED GetStdHandle PROTO STDCALL:DWORD .data buff DB 100h DUP(?) stdInHandle DWORD 0 bytesRead DWORD ? .code start: ;read string from stdin INVOKE GetStdHandle, -10 MOV stdInHandle, eax INVOKE ReadFile, stdInHandle, BYTE PTR[buff], 100, […]

我如何编译C代码作为32位代码,并在64位应用程序中运行? 我可以使用什么工具链?

我想编译C代码就像它是32位应用程序(所以sizeof(void *)将是4),但在64位应用程序内运行它。 我可以保证这个代码不会收到指向4 GB以上的地址空间的指针 我只需要一个工具链来做到这一点。

C ++ Builder – 在汇编中实现全部function

我正在试图实现这个内联汇编技巧来获取EIP在C ++ Builder中的价值。 以下代码在发布模式下工作: unsigned long get_eip() { asm { mov eax, [esp] } } 但是在debugging模式下不起作用。 在debugging模式下,代码必须更改为: unsigned long get_eip() { asm { mov eax, [esp+4] } } 通过检查生成的程序集; 不同之处在于在debugging模式下,为get_eip()函数(第一个版本)生成的代码是: push ebp mov ebp,esp mov eax,[esp] pop ebp ret 但是在发行模式下,代码是: mov eax,[esp] ret 当然,我可以使用#ifdef NDEBUG来解决这个问题。 然而,是否有任何语法,我可以用来指定整个函数在汇编和编译器不应该插入push ebp东西? (或以其他方式解决这个问题)。