Tag: winapi

如何在服务和用户进程之间共享内存?

我有一组Win32应用程序,它们使用CreateFileMapping()和MapViewOfFile()创建的共享内存段共享信息。 其中一个应用是系统服务; 其余部分由登录用户启动。 在Windows XP上,没有问题。 我们将我们的片段命名为“Global \ Something”,一切都很好。 Vista中的额外安全性(以及假设的Windows 7)似乎阻止了这种架构的运行。 不允许普通用户在全局命名空间中创建(Win32错误5)对象。 MSDN表明,如果该帐户具有“创建全局”权限,那么一切都应该很好,但实际上似乎并非如此。 此外,Vista的“完整性”function似乎可以防止“低完整性”用户进程访问“高完整性”服务创建的共享内存对象。 看起来我应该可以通过一些神奇的SetSecurityDescriptorSacl()咒语解决这个问题,但是我很难学会说出来。 所以问题是: 在服务和普通用户进程之间使用共享内存段的正确方法是什么? 为了抢占“刚刚关闭UAC”的简单回答,我们处于一个相当封锁的环境中,这是不可能的。 编辑:服务和用户进程都需要对段进行读/写访问。

为什么我的C程序中的ws2_32.dll会出现链接器错误?

我在Visual Studio 2010中编写程序。我无法将名为ws2_32.dll的文件与我的项目链接。 谁能告诉我怎么做到这一点?

打破ReadFile()阻塞 – 命名管道(Windows API)

为简化起见,这是NamedPipe SERVER正在等待NamedPipe CLIENT写入管道的情况(使用WriteFile()) 阻止的Windows API是ReadFile() 服务器已创建同步管道(无重叠I / O)并启用了阻止 客户端已连接,现在服务器正在等待一些数据。 在正常的事物流中,客户端发送一些数据,服务器处理它,然后返回ReadFile()以等待下一个数据块。 同时发生一个事件(例如用户输入),并且NamedPipe SERVER现在必须执行一些其他代码,当ReadFile()阻塞时,它不能执行。 此时我需要提一下,NamedPipe客户端不是我的应用程序,所以我无法控制它。 我不能让它发送几个字节来解锁服务器。 它只是坐在那里,不发送数据。 由于我无法控制客户端实现,因此我无法更改任何内容。 一种解决方案是创建一个单独的线程,其中执行所有ReadFile()操作。 这样,当事件发生时,我可以处理代码。 问题是,事件还需要一个单独的线程,所以现在我为这个服务器的每个实例都有两个额外的线程。 由于这需要可扩展,因此这是不合需要的。 从另一个线程我尝试过调用 DisconnectNamedPipe() 和 CloseHandle() 它们都不会返回(直到客户端写入管道。) 我无法连接到同一个管道并写入几个字节,因为: “命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。” http://msdn.microsoft.com/en-us/library/aa365590.aspx 我需要一种方法来伪造它,所以$ 64k美元的问题是: 如何打破ReadFile()的阻塞?

Windows数据类型……为什么如此冗余/不合理?

有人可以确切地知道为什么定义了以下typedef s / #define ? 与原件相比,它们有什么价值? typedef char CHAR; #define CONST const typedef float FLOAT; typedef unsigned __int64 DWORD64; //A 64-bit “double”-word?! typedef ULONGLONG DWORDLONG; //What’s the difference? typedef ULONG_PTR DWORD_PTR; //What’s the difference? typedef long LONG_PTR; //Wasn’t INT_PTR enough? typedef signed int LONG32; //Why not “signed long”? typedef unsigned int UINT; //Wait.. UINT is […]

如何为32位位图生成单色位掩码

在Win32下,通过执行以下操作,从位图生成单色位掩码以实现透明度使用是一种常见技术: SetBkColor(hdcSource, clrTransparency); VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY)); 这假设hdcSource是一个保存源图像的内存DC,而hdcMask是一个内存DC,它保存相同大小的单色位图(因此两者都是32×32,但源是4位颜色,而目标是1位单色)。 但是,当源为32位颜色+ alpha时,这对我来说似乎失败了。 我得到的是一个全黑的面具,而不是在hdcMask中获得单色位图。 没有位设置为白色(1)。 而这适用于4位彩色光源。 我的搜索foo失败了,因为我似乎找不到任何对这个特定问题的引用。 我已经发现这确实是我的代码中的问题:即如果我使用16色(4位)的源位图,它可以工作; 如果我使用32位图像,它会产生全黑色蒙版。 在32位彩色图像的情况下,我应该使用另一种方法吗? alpha通道是否存在覆盖上述技术正常行为的问题? 感谢您提供的任何帮助! ADDENDUM:我仍然无法找到为我的GDI +生成的源位图创建有效单色位图的技术。 我有点缓解了我的特殊问题,根本就是根本不生成单色位掩码,而是我正在使用TransparentBlt(),这似乎是正确的(但我不知道他们在内部做了什么,这是任何不同的允许他们正确掩盖图像)。 拥有一个非常好的,有效的function可能是有用的: HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency); 无论hSource的颜色深度如何,它始终会创建有效的透明蒙版。 想法?

在PE文件中解析导入和导出表的RVA

我目前正在编写PE解析器/加载器。 我已经使用标准c文件io成功地将PE文件加载到内存中,检索有效的DOS和PE标头(可选标头)以及访问PE的部分。 我的下一个目标是获取对Export表的访问权以检索导出的符号。 为此,我使用存储在索引0的可选头数据字典数组中的RVA(我相信指向导出表)并将此地址添加到加载到程序存储器中的PE文件的地址,然后将其转换为有效的导出表头。 当我这样做时,我正在调出NULL地址和数据。 这是一个小代码片段; // RVA from optional headers data dictionaries array cast to Export directory type IMAGE_EXPORT_DIRECTORY* ied( (IMAGE_EXPORT_DIRECTORY*)((void*) ((unsigned char*)buffer + ioh->DataDirectory[0].VirtualAddress))); 我是否必须使用内存映射IO来正确执行此操作? 我在计算地址错了吗? 有关PE RVA的信息似乎很少。 提前致谢。

Win32 Api函数的调试中断

我想在SetTimer函数上rest一下,看看哪些组件使用什么值来记录哪些计时器。 这可能吗?

用于Windows平台的C / C ++调用图实用程序

我有一个很大的95%C,5%C ++ Win32代码库,我正试图解决。 有哪些现代工具可用于为C或C ++项目生成调用图表?

如何在没有MSVCR90D.dll的情况下创建Win32 DLL?

我试图用一个简单的函数重新创建一个现有的C Win32 DLL。 我已经设法使用VS C ++ 2008 Express,我的新DLL在我的Vista开发机器和客户端的XP机器上运行。 但是,它不适用于其他网站。 我检查了依赖项,我的DLL需要MSVCR90D.dll和KERNEL32.dll,其中原始DLL只需要KERNEL32.dll。 什么是MSVCR90D.dll,如何在没有此依赖项的情况下创建简单的Win32 DLL?

GetLogicalDrives()for循环

我是win32 api的新手,需要帮助尝试了解GetLogicalDrives()函数的工作原理。 我正在尝试使用未使用的所有可用驱动器填充cbs_dropdownlist。 这是我到目前为止所拥有的。 我将不胜感激任何帮助。 void FillListBox(HWND hWndDropMenu) { DWORD drives = GetLogicalDrives(); for (int i=0; i<26; i++) { SendMessage(hWndDropMenu, CB_ADDSTRING, 0, (LPARAM)drives); } }