我有一组Win32应用程序,它们使用CreateFileMapping() 和创建的共享内存段共享信息MapViewOfFile().其中一个应用是系统服务; 其余部分由登录用户启动.在Windows XP上,没有问题.我们将我们的片段命名为"Global\Something",一切都很好.
Vista中的额外安全性(以及假设的Windows 7)似乎阻止了这种架构的运行.不允许普通用户在全局命名空间中创建(Win32错误5)对象.MSDN表明,如果该帐户具有"创建全局"权限,那么一切都应该很好,但实际上似乎并非如此.此外,Vista的"完整性"功能似乎可以防止"低完整性"用户进程访问"高完整性"服务创建的共享内存对象.看起来我应该能够通过一些神奇的SetSecurityDescriptorSacl()咒语解决这个问题,但是我很难学会说话.
所以问题是:在服务和普通用户进程之间使用共享内存段的正确方法是什么?
为了取代"只是关闭UAC"的简单回答,我们处于一个相当封闭的环境中,这是不可能的.
编辑:服务和用户进程都需要对段进行读/写访问.
我需要创建一个模拟不存在的设备的WDM驱动程序.驾驶员需要在O/S靴,打开和关闭通过要被加载SetupDiXXX和CreateFile,需要响应DeviceIoControl,等等.
我有驱动程序编码,但XP拒绝加载它.系统事件查看器说:
由于以下错误,MyDevice服务无法启动:无法启动该服务,因为它已被禁用或因为它没有与之关联的已启用设备.
鉴于此,我认为问题出在INF文件中(参见下文).是吗?我该怎么办呢?
;; MyDevice.inf
[Version]
Signature="$Windows 95$"
Class=MyDeviceDeviceClass
ClassGUID={ff646f80-8def-11d2-9449-00105a075f6b}
Provider=%ProviderName%
DriverVer= 12/21/2009,1.0.0.1
[ClassInstall32]
Addreg=Class_AddReg
[Class_AddReg]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-18"
[DestinationDirs]
MyDevice_Files_Driver = 10,System32\Drivers
[Manufacturer]
%MfgName%=Mfg0
[Mfg0]
%DeviceDesc%=MyDevice_DDI, *MyDevice
[MyDevice_DDI]
CopyFiles=MyDevice_Files_Driver
AddReg=MyDevice_9X_AddReg
[MyDevice_DDI.NT]
CopyFiles=MyDevice_Files_Driver
AddReg=MyDevice_NT_AddReg
[MyDevice_DDI.NT.Services]
Addservice = MyDevice, 0x00000002, MyDevice_AddService
[MyDevice_AddService]
DisplayName = %SvcDesc%
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %10%\System32\Drivers\MyDevice.sys
[MyDevice_NT_AddReg]
HKLM, "System\CurrentControlSet\Services\MyDevice\Parameters","BreakOnEntry", 0x00010001, 0
[MyDevice_Files_Driver]
MyDevice.sys
[Strings]
ProviderName="Acme"
MfgName="Acme"
DeviceDesc="Acme"
DeviceClassName="Device class for MyDevice"
SvcDesc="MyDevice NT service"
我有一个C++库和一个C++应用程序,试图使用从库中导出的函数和类.库构建正常,应用程序编译但无法链接.我得到的错误遵循以下形式:
app-source-file.cpp :(.text + 0x2fdb):对`lib-namespace :: GetStatusStr(int)'的未定义引用
链接器似乎可以很好地解决库中的类,但是自由函数和导出的数据(如余弦查找表)总是会导致上述错误.
我使用的是Ubuntu 8.04(Hardy),它是最新的Ubuntu软件包.
链接库的命令是(删除了其他库):
g++ -fPIC -Wall -O3 -shared -Wl,-soname,lib-in-question.so -o ~/project/lib/release/lib-in-question.so
Run Code Online (Sandbox Code Playgroud)
链接应用程序的命令是(删除了其他库):
g++ -fPIC -Wall -O3 -L~/project/lib/release -llib-in-question -o ~/project/release/app-in-question
Run Code Online (Sandbox Code Playgroud)
最后,看来(尽我所知)有问题的符号正在正确导出:
nm -D ~/project/lib/release/lib-in-question.so | grep GetStatusStr --> U _ZN3lib-namespace12GetStatusStrEi
Run Code Online (Sandbox Code Playgroud)