1

我为一个非常特殊的安全应用程序创建了一个“特殊文件系统”。

我使用空目录创建了一个重解析点。在这个重解析点后面是一个过滤器驱动程序,它处理 NTFS 和一个用户模式程序之间的通信,该程序正在执行一些加密/解密和控制工作(FUSE、TrueCrypt、RamDisc 之间的混合......)。整个东西是 C/C++ 原生的,在 Win7 x64 下工作正常。

现在我有一个很好的任务让它适用于windwos xp x64专业版。当整个应用程序以管理员权限运行时,它工作正常,但是当我切换到用户帐户时,我无法访问挂载的目录。

挂载程序和“特殊文件系统”(我们将其命名为 sfs)是系统服务,其他应用程序必须在用户帐户(COM 相关)下运行,挂载操作成功(当我在挂载操作后切换到管理员帐户时,我可以访问目录),应用程序的其他部分也可以正常工作,但我唯一无法管理的是访问这个目录。

我给了“每个人”和用户组以及特定用户对驱动程序、库(驱动程序和 sfs 之间的链接)、安装程序和特殊文件系统的所有权限,并且在注册表中也做了很多。我还将此权限授予已安装的目录(所有权限,所有者,...),但没有任何效果。

调试输出显示,对目录或内部文件的请求永远不会到达“sfs”。看起来,IO-Manager 从来没有向这个地址发送过一些东西。另一个问题是,我无法从操作系统获取所有调试输出(以本地调试模式启动并使用 SysInternals 的 DebugView.exe),但那是另一回事。

我错过了什么?XP和Win7的安全系统有什么区别?XP中是否有我不知道的基本限制?

请询问您是否需要代码片段。

欢迎任何建议或想法!

4

1 回答 1

0

找到了!

我忘了为设备本身设置安全性!不早点发现这是多么糟糕的事情!:-(

这是挂载服务中的部分:

static VOID GetSecAttr(PSECURITY_ATTRIBUTES SecAttr)
{

   LPTSTR sd = L"D:P(A;;GA;;;SY)(A;;GRGWGX;;;BA)(A;;GRGW;;;WD)(A;;GR;;;RC)";

   ZeroMemory(SecAttr, sizeof(SECURITY_ATTRIBUTES));

   ConvertStringSecurityDescriptorToSecurityDescriptor(sd, SDDL_REVISION_1, &SecAttr->lpSecurityDescriptor, NULL);

   SecAttr->nLength = sizeof(SECURITY_ATTRIBUTES);
   SecAttr->bInheritHandle = TRUE;
}

static VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{

//... some declarations ...
   SECURITY_ATTRIBUTES sa;

//... some stuff like syncronisation, named pipe and so on...
   GetSecAttr(&sa);

   device = CreateFile(
       MY_DEVICE_NAME,
       GENERIC_READ | GENERIC_WRITE,
       FILE_SHARE_READ | FILE_SHARE_WRITE,
       &sa,                //!!! and this was NULL!!!
       OPEN_EXISTING, 
       FILE_FLAG_OVERLAPPED, 
       NULL);

   if (device == INVALID_HANDLE_VALUE) {/*...*/}
}

感谢所有花时间帮助我的人!

...为什么这对 Win7 有效?!?

于 2012-10-03T09:24:00.050 回答