草庐IT

windows - call immediate 与 call dword near [dword addr]

所以最近我一直想从汇编中调用一些win32调用,并且我一直在使用NASM作为我的外部汇编程序。我调用SendMessage在我的代码中以下列方式:call__imp__SendMessageW@16这被组装成一个相对跳转(0xE8操作码),结果是访问冲突。在调试器中,计算出的跳转偏移似乎是正确的(因为__imp__SendMessageW@16似乎确实驻留在那儿)但它仍然不起作用。当我从C++调用函数时检查VisualStudio生成的程序集,我注意到它不是使用相对直接跳转,而是(用MASM的语言)calldwordptr[__imp__SendMessageW@16],对应于0xFF

c# - 为什么系统调用 GetIpNetTable 的物理地址有 8 个字节(而不是 6 个字节)?

在我最新的项目中,我使用GetIpNetTable从C#使用.NET访问WindowsARP表我注意到,当我查看MAC地址时,我的条目的最后两个字节(7和8)不断变化!由于MAC地址通常只有6个字节,我想知道这两个字节包含什么...参见http://msdn.microsoft.com/en-us/library/cc704859%28v=prot.10%29.aspxypedefstruct_MIB_IPNETROW{DWORDdwIndex;DWORDdwPhysAddrLen;BYTEbPhysAddr[8];//WHY8BYTES??DWORDdwAddr;DWORDdwTyp

c++ - 将 dword 的 void* 表示形式转换为 wstring

我星期一很蠢,所以我很抱歉发布这样一个像新手一样的问题。我正在使用CRegKey.QueryValue从注册表返回一个双字值。QueryValue将值写入void*pData,将长度写入ULONG*pnBytes。现在有一种方法可以通过stringstream将它从pData获取到wstring。我最接近的是得到十六进制字符串的结果。我正准备将十六进制表示形式转换为双字,然后从那里转换为wstring,当我认为这很愚蠢并在这里提问而不是在这个问题上浪费我生命中的另一个小时。 最佳答案 为什么不使用CRegKey::QueryDWOR

c++ - 错误 C2065 : 'DWORD_PTR' : undeclared identifier

编译时#include"windows.h"#include"stdafx.h"#include"resource.h"#include"ProgressDlg.h".......rItem.lParam=(LPARAM)(DWORD_PTR)m_lsStatusMessages.back().c_str();IamgettingtheerrorC2065:'DWORD_PTR':undeclaredidentifier我是否遗漏了任何包含内容。 最佳答案 #include"windows.h"#include"stdafx.h"假

c - 如何从注册表中获取每个键和子键?

我正在尝试编写一个应用程序,我可以在其中提供一个注册表路径,例如HKLM\hardware\description\system并且我的应用程序应该在系统下读取每个键名,如果有子键它们的名字,如果还有更多的子项然后他们的名字等等...我的应用程序正在运行(或多或少),但我的问题是如何计算子键?比如system下有2个key,a和b,a下多了3个key,b下多了5个,那我应该怎么算自己在哪个sublevel呢?这很重要,因为我必须知道如何连接注册表路径?到目前为止,这是我的代码(大部分来自msdn,但我找不到类似的示例):#include#include#include#include#

c - RegQueryValueEx()读取REG_DWORD时总是在*lpData中填0

我对RegQueryValueEx()函数有疑问当我使用它时,它用0填充*lpDataLONGWINAPIRegQueryValueEx(_In_HKEYhKey,_In_opt_LPCTSTRlpValueName,_Reserved_LPDWORDlpReserved,_Out_opt_LPDWORDlpType,_Out_opt_LPBYTElpData,_Inout_opt_LPDWORDlpcbData);这是不起作用的代码#include#includeintmain(){HKEYhKey=NULL;DWORDdata=42;DWORDtype=REG_DWORD;DWOR

c++ - _WIN32_WINNT 定义在 header 中更改,这是否会导致二进制不兼容?

在VS2010中,我正在努力将应用程序更新到第三方库的新版本,该库要求_WIN32_WINNT至少为0x501,但另一个提供二进制共享库的第三方共享库在header中将其定义为0x500包含在应用程序中。如果修改了,是否会出现二进制不兼容或者这是一个无关紧要的更改?我是否必须从将其定义为0x500的库中请求新的二进制文件?我不确定如何判断这是否需要新的bin——我认为如果任何类/结构的大小或命名发生变化,或者任何方法/函数签名发生变化,则需要进行新的编译。 最佳答案 简短的回答:可能不会,但如果是的话,那你就进退两难了。长答案:_W

c++ - 帮助!错误 C2040 : 'HWINEVENTHOOK' : 'DWORD' differs in levels of indirection from 'HWINEVENTHOOK__ *'

我正在一个新机器(vista64)上编译我的应用程序,现在它不再编译了。编译器给我标题中的错误。问题似乎(?)是HWINEVENTHOOK在中定义了两次windef.h#if(WINVER>=0x0400)DECLARE_HANDLE(HWINEVENTHOOK);#endif/*WINVER>=0x0400*/然后在winable.h中是#ifWINVER但是,我刚刚查找了vista的WINVER,它是0x0600,而windowsXP是0x0501那么为什么要定义DWORD?我不知所措。有人帮忙吗? 最佳答案 根据thisMSD

Windows (x86) 程序集将空终止符 append 到输入的字符串

我目前正在尝试将空终止符append到(a?)用户输入的字符串:.386.modelflat,stdcallWriteFilePROTOSTDCALL:DWORD,:PTR,:DWORD,:PTRDWORD,:PTROVERLAPPEDReadFilePROTOSTDCALL:DWORD,:PTR,:DWORD,:PTRDWORD,:PTROVERLAPPEDGetStdHandlePROTOSTDCALL:DWORD.databuffDB100hDUP(?)stdInHandleDWORD0bytesReadDWORD?.codestart:;readstringfromstdinI

windows - 在PE的导入表中添加一个条目

我正在寻找一个命令行程序来向PE文件的导入表添加一个条目。我的目标是从外部DLL添加一个新的导入函数到我的EXE,然后使用ollydbg使用代码洞穴插入新代码。新代码将使用新导入的函数。实际上我已经实现了我的目标,但是为了向我使用的导入表添加一个新条目Stud_PE,这是一个GUI应用程序,我想自动化这部分过程。我会考虑以编程方式解决方案,但我担心PE结构太复杂,我无法在我的时间范围内学习和探索。此外,如果一个实现已经存在,那么不使用它是一种耻辱。:-) 最佳答案 找到了正在寻找的东西。m-PEFileforc++:http://f