从TCP设备对象读取数据

从TCP设备对象读取数据,c,winapi,tcp,driver,C,Winapi,Tcp,Driver,我正在尝试打开TCP对象设备驱动程序的句柄 这是我的代码: NTSTATUS OpenTcpDeviceObject(PHANDLE tcpFile, ACCESS_MASK DesiredAccess) { UNICODE_STRING fileName; OBJECT_ATTRIBUTES objectAttributes; IO_STATUS_BLOCK IOBlock; RtlInitUnicodeString(&fileName, TEXT("

我正在尝试打开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
,问题是为什么这不起作用?我正在以非管理员帐户从usermode运行此程序。据我所知,只要我将
ACCESS\u MASK
设置为
FILE\u READ\u DATA
,此操作就不需要管理员权限

注意

返回的
状态将指向
错误\u访问被拒绝(5)
作为Dos错误。但是,如果我只请求读取权限,如何拒绝访问?但是,当我运行访问Tcp设备对象的命令时,它允许我无特权访问多播/单播地址

那么,问题出在哪里?

设备\Tcp有下一个DACL

如果您不是
SYSTEM
Administrators
您只有
FILE\u READ\u属性| FILE\u EXECUTE | SYNCHRONIZE | READ\u CONTROL
或在wdm.h中声明为
FILE\u GENERIC\u EXECUTE
。因此,当您请求
文件读取数据时,您没有
文件读取数据
访问权限,必须获得
c00000022

关于
getAdapterAddresses
-它不能用
文件读取数据打开tcp设备。他只要求
文件读取属性|同步
。您永远不会在tcp设备上调用
ZwReadFile
。我们通过
ZwDeviceIoControlFile
从中获得了信息。每个IOCTL代码中都对所需的访问进行了编码,大多数IOCTL代码声明为
文件\u ANY\u访问
——这意味着使用ANY访问的文件句柄是正常的。例如
IOCTL\u TCP\u QUERY\u INFORMATION\u EX
定义为
CTL\u code(文件、设备、网络、方法、文件、任何访问)
,所以您不需要对文件进行读取数据访问。仅使用
同步
访问权限打开文件-这就足够了


请注意,在最新的windows版本上使用\Device\Nsi是什么意思<代码>同步
通常包含在
文件读取数据
中-为什么会出现问题?AFAIK没有规定如果您被授予
文件读取数据
,则必须被授予
同步
,因此这可能是问题所在。结果不是这样,但可能是这样。:-)
T FL AcessMsK Sid
A 00 001200A0 S-1-1-0 'Everyone'
A 00 001F01FF S-1-5-18 'SYSTEM'
A 00 001F01FF S-1-5-32-544 'Administrators'
A 00 001200A0 S-1-5-12 'RESTRICTED'