Articles of winapi

从32位进程获取64位进程的命令行string

下面的代码适用于从32位应用程序获取32位进程的命令行string,64位应用程序的64位进程和64位应用程序的32位进程。 如果我尝试从32位应用程序使用64位进程,这将中断。 原因是PROCESS_BASIC_INFORMATION和地址大小的结构大小不同。 所以这里是我的问题 – 1)过程黑客( http://processhacker.sourceforge.net/forums/viewtopic.php?f=15&t=181 )中使用wow64函数给出的build议似乎不工作,并失败,并出现以下错误 – NtWow64ReadVirtualMemory64错误:8000000D读取从A68291A0004028E0 ProcessParameters地址 有没有人试过,可以成功获取信息? 我在论坛上发表了同样的意见。 2)是否有任何其他方法来查询peb信息,可以为x86和x64可靠工作? int get_cmdline_from_pid( DWORD dwPid, char** cmdLine ) { DWORD dw, read; HANDLE hProcess; NtQueryInformationProcess* pNtQip; PROCESS_BASIC_INFORMATION pbInfo; UNICODE_STRING cmdline; WCHAR* wcmdLine; *cmdLine = NULL; hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPid ); if( !hProcess ) return FALSE; pNtQip = (NtQueryInformationProcess*) […]

以编程方式将访问控制列表(ACL)权限分配给“此文件夹,子文件夹和文件”

我必须分配一个文件夹的权限,它是使用C#.NET编程的子文件夹和文件。 我这样做如下: var rootDic = @"C:\ROOT"; var identity = "NETWORK SERVICE"; //The name of a user account. try { var accessRule = new FileSystemAccessRule(identity, fileSystemRights: FileSystemRights.Modify, inheritanceFlags: InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, propagationFlags: PropagationFlags.InheritOnly, type: AccessControlType.Allow); var directoryInfo = new DirectoryInfo(rootDic); // Get a DirectorySecurity object that represents the current security settings. DirectorySecurity dSecurity = directoryInfo.GetAccessControl(); // […]

是否有可能等到其他线程处理过程input消息?

我想模拟用户input到其他窗口可靠。 我为此使用SendInput ,但是之后我需要等到目标应用程序在发送更多消息之前处理input。 据我所知, SendInput ,尽pipe它的名字,真正的消息发送到队列,不等待,直到他们被处理。 我的尝试是基于这个想法,直到消息队列至less一次是空的。 因为我不能直接检查其他线程消息队列(至less我不知道这样做),所以我使用AttachThreadInput将目标线程的队列附加到该线程的队列,然后使用PeekMessage进行检查。 为了检查function,我使用一个窗口和一个button的小应用程序。 当点击button时,我调用Thread.Sleep(15000)有效地停止消息处理,从而确保在接下来的15s消息队列不能为空。 代码在这里: public static void WaitForWindowInputIdle(IntPtr hwnd) { var currentThreadId = GetCurrentThreadId(); var targetThreadId = GetWindowThreadProcessId(hwnd, IntPtr.Zero); Func<bool> checkIfMessageQueueIsEmpty = () => { bool queueEmpty; bool threadsAttached = false; try { threadsAttached = AttachThreadInput(targetThreadId, currentThreadId, true); if (threadsAttached) { NativeMessage nm; queueEmpty = !PeekMessage(out nm, hwnd, […]

使用Diskpart命令行实用程序隐藏驱动器后如何访问

我想用Diskpart命令行实用程序来隐藏用户的驱动器。 我使用删除字母命令和驱动器变得隐藏。 但是我想用我用C语言编写的程序来使用那个驱动器的数据。 我怎么能做到这一点,或者有可能吗? 我想这样做只适用于USB闪存驱动器。 如果这是不可能的,请给我另一种方法来正确地做到这一点? 非常感谢,祝你好运。

RASPHONE.exe和RASDIAL.exe之间的区别

我尝试以编程方式build立拨号连接。 我尝试使用RASdial.exe和RASPhone.exe,除RasDial.exe显示在RasUp.exe在用户界面中给出的控制台中的错误外,两者都是一样的。 有人可以解释我Rasdial和Rasphone之间的区别,也是正确的一个拨号连接。 我想在用户界面中的错误消息,而不是在控制台。 请详细解释一下。

用户locking屏幕的Windows消息

我正在用C ++编写老式Windows编程,我需要在我的WndProc中捕获一个表示用户已经注销或locking屏幕的事件。 更新 (谢谢David Hefernan)我到处search,但唯一发现的是WM_ENDSESSION消息 – 它不处理屏幕locking事件。 任何人都知道这是怎么做的? 我需要通过Windows XP的风格将其应用到Windows 2000。

在将ASCIIstring传递给Windows API函数之前将其转换为UTF-16

在我目前的项目中,我一直在使用宽字符(utf16)。 但是因为我唯一的用户input将是一个URL,反正最后还是一个string,另外一个string,我只想把整个程序切换到ascii。 我的问题是,在将string传递给Windows API函数之前将string转换为utf16有什么好处吗? 在网上做了一些研究之后,好像很多人推荐这个,如果你不在Windows上使用UTF-16。

在Delphi中CreateFile不能返回一个合适的Handle – 设备

希望能find一些在windows中有服务经验的人。 我想在Delphi中使用NdisProt驱动程序用于以太网适配器 my_Handle:= CreateFile(PChar('\\。\ NdisProt'), GENERIC_WRITE或GENERIC_READ,0,nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); (也曾用\\.\\NdisProt ) 执行后, my_Handle的值始终为“4008”,GetLastError总是返回0 如果我试图读取或写入文件,我得到违反,有人知道为什么我得到这种不需要的行为?

微软怎么能说WinAPI中一个单词的大小是16位?

我刚开始学习WinAPI。 在MSDN中,为WORD数据types提供了以下说明。 字 一个16位无符号整数。 范围是0到65535十进制。 这个types在WinDef.h中声明如下: typedef unsigned short WORD; 很简单,它与我一直用来学习的其他资源相匹配,但它怎么可以明确地说,它是16位? 维基百科上的C数据types页面指​​定 short / short int / signed short / signed short int 短签名整数types。 能够至less包含[-32767,+32767]范围; 因此它至less有 16位的大小。 所以根据C标准, short的大小short可能是32位。 但谁决定使用什么样的比特尺寸呢? 我在这里find一个实际的解释 。 具体而言,该行: …这取决于两个处理器(更具体地说,ISA,指令集架构,例如x86和x86-64)和编译器,包括编程模型。 所以这是ISA,这是有道理的,我想。 这是我迷路的地方。 看看维基百科上的Windows页面 ,我可以在侧面看到: 平台ARM,IA-32,Itanium,x86-64,DEC Alpha,MIPS,PowerPC 我真的不知道这些是什么,但我认为这些是处理器,每个将有一个ISA。 也许Windows支持这些平台,因为所有这些平台都保证使用16位作为unsigned short ? 这听起来不太对,但我对这个东西还没有足够的了解。 回到我的问题:Windows API如何能够inputtypedef unsigned short WORD; 那么当C标准本身不能保证一个总是16位时, WORD是一个16位无符号整数?

如何更改button上的光标?

static HWND btn; HCURSOR cursor = LoadCursor(0, IDC_CROSS); case WM_CREATE: btn = CreateWindow(TEXT("BUTTON"), TEXT("Press Me"), WS_CHILD|WS_VISIBLE, 50, 50, 80, 30, hwnd, (HMENU) 111, NULL, NULL); 现在,在WM_COMMAND ,我尝试使用: SendMessage(btn, WM_SETCURSOR, 0, (LPARAM) cursor); 哪个不行 那么点击button后,如何更改鼠标的光标呢? 另外,当鼠标hover在button上时,如何更改鼠标的光标(例如,当鼠标hover在网页浏览器的链接上时,它会变成一只手)?