gpt4 book ai didi

c - DeviceIoControl 返回 ERROR_ACCESS_DENIED

转载 作者:行者123 更新时间:2023-12-03 11:06:40 28 4
gpt4 key购买 nike

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

#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;
}

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

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

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

再次抱歉,如果我误解了某些东西或错过了一些重要的东西,但我正在学习所有这些,在此先感谢!

最佳答案

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

关于c - DeviceIoControl 返回 ERROR_ACCESS_DENIED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61562617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com