你好,我把你的代码修改成了内核程序下可以使用,下面是我的代码SOCKET AfdSocket::WSPSocket(int AddressFamily, int SocketType, int Protocol)
{
if (AddressFamily == AF_UNSPEC && SocketType == 0 && Protocol == 0) {
return INVALID_SOCKET;
}
//进行基础数据设置
if (AddressFamily == AF_UNSPEC) {
AddressFamily = AF_INET;
}
if (SocketType == 0)
{
switch (Protocol)
{
case IPPROTO_TCP:
SocketType = SOCK_STREAM;
break;
case IPPROTO_UDP:
SocketType = SOCK_DGRAM;
break;
case IPPROTO_RAW:
SocketType = SOCK_RAW;
break;
default:
SocketType = SOCK_STREAM;
break;
}
}
if (Protocol == 0)
{
switch (SocketType)
{
case SOCK_STREAM:
Protocol = IPPROTO_TCP;
break;
case SOCK_DGRAM:
Protocol = IPPROTO_UDP;
break;
case SOCK_RAW:
Protocol = IPPROTO_RAW;
break;
default:
Protocol = IPPROTO_TCP;
break;
}
}
NTSTATUS st = STATUS_UNSUCCESSFUL;
OBJECT_ATTRIBUTES ObjectAttributes = { 0 };
InitializeObjectAttributes(&ObjectAttributes, &tcpip, OBJ_CASE_INSENSITIVE | OBJ_INHERIT | OBJ_KERNEL_HANDLE, NULL, NULL);
HANDLE Handle = NULL;
IO_STATUS_BLOCK io = { NULL };
UCHAR EaBuffer[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00,
0x41, 0x66, 0x64, 0x4F, 0x70, 0x65, 0x6E, 0x50,
0x61, 0x63, 0x6B, 0x65, 0x74, 0x58, 0x58, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
memmove((PVOID)((__int64)EaBuffer + 32), &AddressFamily, 0x4);
memmove((PVOID)((__int64)EaBuffer + 36), &SocketType, 0x4);
memmove((PVOID)((__int64)EaBuffer + 40), &Protocol, 0x4);
if (Protocol == IPPROTO_UDP)
{
memmove((PVOID)((__int64)EaBuffer + 24), &Protocol, 0x4);
}
st = ZwCreateFile(&Handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &ObjectAttributes, &io, 0, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, 0, EaBuffer,
sizeof(EaBuffer));
if (st != STATUS_SUCCESS) {
DbgPrint("st:%X\r\n",st);
return INVALID_SOCKET;
}
else {
return (SOCKET)Handle;
}
你好,我把你的代码修改成了内核程序下可以使用,下面是我的代码SOCKET AfdSocket::WSPSocket(int AddressFamily, int SocketType, int Protocol)
{
if (AddressFamily == AF_UNSPEC && SocketType == 0 && Protocol == 0) {
return INVALID_SOCKET;
}
//进行基础数据设置
if (AddressFamily == AF_UNSPEC) {
AddressFamily = AF_INET;
}
if (SocketType == 0)
{
switch (Protocol)
{
case IPPROTO_TCP:
SocketType = SOCK_STREAM;
break;
case IPPROTO_UDP:
SocketType = SOCK_DGRAM;
break;
case IPPROTO_RAW:
SocketType = SOCK_RAW;
break;
default:
SocketType = SOCK_STREAM;
break;
}
}
if (Protocol == 0)
{
switch (SocketType)
{
case SOCK_STREAM:
Protocol = IPPROTO_TCP;
break;
case SOCK_DGRAM:
Protocol = IPPROTO_UDP;
break;
case SOCK_RAW:
Protocol = IPPROTO_RAW;
break;
default:
Protocol = IPPROTO_TCP;
break;
}
}
}
大部分电脑都是没有问题的,今天我在运用时候发现有一台电脑会返回st:0x8000001C的错误代码,请问这是什么问题