【发布时间】:2017-10-02 01:36:30
【问题描述】:
我正在尝试打开 TCP 对象设备驱动程序的句柄。
这是我的代码:
NTSTATUS OpenTcpDeviceObject(PHANDLE tcpFile, ACCESS_MASK DesiredAccess) {
UNICODE_STRING fileName;
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK IOBlock;
RtlInitUnicodeString(&fileName, TEXT("\\Device\\Tcp"));
InitializeObjectAttributes(
&objectAttributes, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL);
NTSTATUS Status = NtOpenFile(
tcpFile, DesiredAccess | SYNCHRONIZE, &objectAttributes, &IOBlock,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
*tcpFile = INVALID_HANDLE_VALUE;
return Status;
}
然而状态返回-1073741790,问题是为什么这不起作用?我在非管理员帐户上从用户模式运行它。据我了解,只要我将ACCESS_MASK 设置为FILE_READ_DATA,此操作不需要管理员权限。
注意
返回的 Status 指向 ERROR_ACCESS_DENIED (5) 作为 Dos 错误。但是,如果我只要求读取权限,如何拒绝访问?但是,当我运行访问 Tcp 设备对象的GetAdaptersAddresses 时,它允许我在没有特权的情况下访问多播/单播地址!
那么问题出在哪里?
【问题讨论】:
-
@HarryJohnston 你是什么意思?
SYNCHRONIZE通常包含在FILE_READ_DATA中 - 为什么会出现问题? -
AFAIK 没有规定,如果您被授予
SYNCHRONIZE,则必须授予您SYNCHRONIZE,以便 可能 成为问题。事实证明它不是,但它可能是。 :-)