首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回ERROR_ACCESS_DENIED的DeviceIoControl

返回ERROR_ACCESS_DENIED的DeviceIoControl
EN

Stack Overflow用户
提问于 2020-05-03 00:20:18
回答 1查看 426关注 0票数 3

我正在尝试与一个用于创建TUN接口(WinTun)的驱动程序接口,但是为了从它们发送和接收数据,我需要注册一个环形缓冲区。我使用的代码看起来像这样(我省略了用SetupApi创建设备的部分,因为这似乎是有效的):

代码语言:javascript
复制
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>

#define REGISTER_RINGS_IOCTL CTL_CODE(51820U, 0x970U, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)

#define BUF_CAPACITY 0x20000
#define BUF_TRAILING 0x10000

typedef struct {
    volatile ULONG Head;
    volatile ULONG Tail;
    volatile LONG Alertable;
    UCHAR Data[BUF_CAPACITY + BUF_TRAILING];
} TUN_RING;

typedef struct {
    ULONG Size;
    UCHAR Data;
} TUN_PACKET;

typedef struct {
    struct {
        ULONG RingSize;
        TUN_RING *Ring;
        HANDLE TailMoved;
    } Send, Receive;
} TUN_REGISTER_RINGS;

int main() {

    HANDLE device = CreateFileW(
        L"\\\\?\\ROOT#NET#0006#{cac88484-7515-4c03-82e6-71a87abac361}",
        // ^^ This comes from the omitted code ^^
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL,
        OPEN_EXISTING,
        0,
        NULL
    );

    if(device == INVALID_HANDLE_VALUE) {
        printf("The device does not exist\n");
        return -1;
    }

    TUN_RING Send, Receive = {0};

    TUN_REGISTER_RINGS params = {
        .Send.RingSize = sizeof(TUN_RING),
        .Send.Ring = &Send,
        .Send.TailMoved = CreateEventW(NULL, FALSE, FALSE, NULL),

        .Receive.RingSize = sizeof(TUN_RING),
        .Receive.Ring = &Receive,
        .Receive.TailMoved = CreateEventW(NULL, FALSE, FALSE, NULL),
    };

    DWORD bytes;

    BOOL ret = DeviceIoControl(
        device,
        REGISTER_RINGS_IOCTL,
        &params,
        sizeof(TUN_REGISTER_RINGS),
        NULL,
        0,
        &bytes,
        NULL
    );

    if(ret == 0) {
        printf("Err: %d\n", GetLastError());
        return -2;
    }

    return 0;
}

我的问题是,此代码在对应于ERROR_ACCESS_DENIED的DeviceIoControl上失败,并显示错误5。

我不知道为什么会发生这种情况,因为程序已经使用管理员权限运行,并且设备句柄已经使用推荐的属性(as you can see here)打开。很抱歉没有额外的信息,但我没有太多的经验,当涉及到windows驱动程序,也不知道如何进一步调试。

我认为问题可能与这个check in the source code of the driver有关,因为它似乎在检查输入缓冲区之前就停止了(当我将垃圾放入输入缓冲区时,它应该会返回INVALID_PARAMETER,但这并没有发生)。

再次抱歉,如果我误解了什么或错过了一些关键的东西,但我正在学习所有这些,提前谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-03 03:57:40

找到了解决方案。正如@RbMm所述,code that creates the security descriptor只允许访问LocalSystem。这意味着它是唯一允许与司机交谈的账号。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61562617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档