- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试替换一些遗留的 DefineDosDevice
用户空间代码(由于提升的和正常的 session 由不同的 DosDevice 存储表示,因此在具有管理员用户的 Vista 上不起作用,因此创建一个相当奇怪的场景,即如果从未提升的进程创建驱动器是可见的,但如果从提升的进程创建则不可见)。
这个的替代品,正如我通过检查 Truecrypt source 发现的那样还有这个WDM sample是向 mountmgr.sys 发出 IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION
消息,然后向 IOCTL_MOUNTMGR_CREATE_POINT
/IOCTL_MOUNTMGR_DELETE_POINT
发送消息。
这就是我正在做的 - 我的代码如下所示:
首先是各种本地人:
NTSTATUS ntStatus;
PDEVICE_EXTENSION device_extension;
UNICODE_STRING uVolumeName;
ULONG mntNameLen = 0;
ULONG mntPointLen = 0;
PMOUNTMGR_TARGET_NAME mntName = NULL;
PMOUNTMGR_CREATE_POINT_INPUT mntPoint = NULL;
然后,我构造并提出我的两个请求。第一个失败并显示上述状态代码。第二个失败并显示不同的状态代码(但如果第一个失败则预计不会工作)。
mntNameLen = sizeof(MOUNTMGR_TARGET_NAME) + device_extension->sDevName.Length;
mntName = ExAllocatePool(PagedPool, mntNameLen);
mntName->DeviceNameLength = device_extension->sDevName.Length;
RtlCopyMemory(mntName->DeviceName, device_extension->sDevName.Buffer,
mntName->DeviceNameLength);
ntStatus = MakeDeviceIoRequest (MOUNTMGR_DEVICE_NAME,
IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION,
mntName, mntNameLen, 0, 0);
mntPointLen = sizeof(PMOUNTMGR_CREATE_POINT_INPUT) +
device_extension->sDevName.Length + uVolumeName.Length;
mntPoint = ExAllocatePool(PagedPool, mntPointLen);
mntPoint->SymbolicLinkNameOffset = sizeof (MOUNTMGR_CREATE_POINT_INPUT);
RtlCopyMemory(&mntPoint+mntPoint->SymbolicLinkNameOffset,
uVolumeName.Buffer, uVolumeName.Length * sizeof(WCHAR));
mntPoint->SymbolicLinkNameLength = uVolumeName.Length;
mntPoint->DeviceNameOffset = mntPoint->SymbolicLinkNameOffset +
mntPoint->SymbolicLinkNameLength;
RtlCopyMemory(&mntPoint+mntPoint->DeviceNameOffset,
device_extension->sDevName.Buffer, device_extension->sDevName.Length);
mntPoint->DeviceNameLength = device_extension->sDevName.Length;
ntStatus = MakeDeviceIoRequest(MOUNTMGR_DEVICE_NAME,
IOCTL_MOUNTMGR_CREATE_POINT, mntPoint,
mntPointLen, 0, 0);
然后我创建符号链接(symbolic link)\GLOBAL??\L: ->\Device\DeviceName
ntStatus = IoCreateSymbolicLink(&uVolumeName, &(device_extension->sDevName));
DbgPrint("Mapped %wZ -> %wZ\n", &uVolumeName, &(device_extension->sDevName));
RtlFreeUnicodeString(&uVolumeName);
if ( mntName != NULL )
{
ExFreePool(mntName);
}
if ( mntPoint != NULL)
{
ExFreePool(mntPoint);
}
但是,挂载管理器的 ntStatus
响应是 0xC0000010
STATUS_INVALID_DEVICE_REQUEST
;我的设备字符串的格式为 \Device\DevName
并响应每个:
以及存储设备预期的其他 IOCTL 列表。但是,我在所有这些例程上都设置了断点,但都没有达到。
我的设备是通过这个小片段创建的:
// Security descriptor
RtlInitUnicodeString(&sddl,
_T("D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;BU)(A;;GA;;;WD)"));
// named device
status = IoCreateDeviceSecure(
DriverObject,
sizeof(DEVICE_EXTENSION),
&device_name, // \Device\DeviceName
DeviceType, // valid devicetype.
0,
FALSE,
&sddl, // security descriptor
NULL, // no idea what this does.
&device_object // output device object.
);
那么,下面是一些问题:
IoCallDriver
,我有理由相信这不是问题所在。CreateDevice
做的事情有问题吗?我问是因为我读了this blog post这暗示了一些关于设备名称、FDO 和 PDO 的东西,老实说我不太明白。注意:我有一些限制。我在其上构建的代码相当遗留,因此我包括了 ntddk.h 和 wdmsec.h
;在此阶段,我无法将它们更改为 wdm.h
或 ntifs.h
。
最佳答案
在深入探讨之前,您是否有机会将对 DefineDosDevice 的调用转移到服务中?从服务调用它会将链接放在全局目录中,这将完全消除您遇到的别名问题。
如果您不能这样做,我的第一个猜测是您没有处理其他一些必需的安装管理器 IOCTL。我知道您在所有特定的 IOCTL 上都有断点,但是您在默认处理程序中有断点吗?通常这是 STATUS_INVALID_DEVICE_REQUEST 的来源。
关于c - 如何与 NT 安装管理器交互以分配驱动器号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944475/
我听说最好不要从您系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
我听说最好不要从系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统的核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
单独安装 electron 与通过 electron-builder 安装有什么区别?我正在使用 React 构建一个 Electron 应用程序,并且已经找到了一些教程。它们安装 Electron
两者安装有什么区别?我按照安装页面上的说明在全局范围内安装了 webpack,然后我转到了入门指南,据说在那里可以在本地安装 webpack-cli。 CLI = Command Line Inter
我在 OS X Yosemite 上用 PHP 安装了默认的 Apache 服务器,安装了 pear,用 brew 安装了 Solr (brew install solr),现在我正在尝试使用 PEC
我解压并编译了 Ruby 2.1 并安装了几个支持工具。 但是当我安装了 libssl-dev 时,OpenSSL 不会安装。 我在支持 openssl 时遇到这个错误: make: *** No r
我在 android studio 2.3.1 和 gradle 3.2 中设计了 2 到 3 个应用程序。当我从它运行应用程序到任何设备或模拟器时,一切都工作正常。但是当我从构建文件夹中获取该 ap
我注意到我正在读一本书提到通过 apt-get 安装 numpy 和 opencv apt-get install python-numpy python-opencv 但我可以通过以下方式在 pip
我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了我需要调用 ansicon -i 的级别。当我在 cmd 中输入此内容并运行 python 脚本时效果很好,但是当我通
我有 linux MINT 17.3 Kernel 4.4.0-81 所有更新可用。 (由于不同的原因,我无法迁移到更新版本的 ubuntu/mint) 我已经通过 PPA 安装了 FFMPEG(不是
尝试在本地运行我的应用程序时出现错误: 我只在 chrome 浏览器中收到此错误。我尝试过不同的东西,但我不确定为什么它是 Chrome 特定的。 最佳答案 我怀疑这不是 Firebase 问题,而是
这是我第一次开发 AngularJS 应用程序并使用脚手架工具 Yeoman ( http://yeoman.io/ )。我想对我的一些图标使用 fontawesome ( http://fortaw
我知道您通常“应该”$ pip install 如果包没有 brew ,但如果有一个你想安装的 python 包,你可以使用 $ pip install或 $ brew install为了?例如,通过
我正在尝试通过 RVM 安装 Ruby 1.9.3。然而,当谈到安装 RubyGems 时,我得到了这个: curl: (22) The requested URL returned error: 4
我是真正提出问题的新手,但你去吧。 我一直在尝试按照安装指南添加 dnsname: https://github.com/containers/dnsname https://github.com/c
Studio更新至0.4.0 建筑产量为“需要1.8版Gradle”;将设置设置为1.8 bin目录; 建立 “要求1.9级”;将设置设置为1.9 bin; 建立 “要求1.8级” 啊。不知道该怎么做
我刚刚注意到 kernel.org 因维护而停机。是否有使用不同镜子的不同公式?或者我可以向 Homebrew 软件添加不同的来源(如 bundler ?)? 谢谢你的帮助! 最佳答案 快速解决方法:
当我运行时: peardev install phpunit/PHPUnit 我得到以下信息: No releases available for package "pear.phpunit.de/P
服务器操作系统为Fedora 24. 64bit。 我想安装 Git 2.6.6。 所以下载源码并安装。 此服务器离线。所以我不使用“yum”。 ./configure --prefix=/usr/l
我正在尝试在我自己的服务器(操作系统:Linux Ubuntu Server 12.04)上安装 OpenEdX,但我遇到了同样的错误。谁能帮帮我? TASK: [ insights | insta
我是一名优秀的程序员,十分优秀!