Доброго времени суток XP SP2 Пытаюсь получить DEVICE_OBJECT для TcpIpDevice Код (Text): PDEVICE_OBJECT pTcpIpDevice; PFILE_OBJECT pFileObject ...... RtlInitUnicodeString(&Name, TCPIP_DEVICE); InitializeObjectAttributes(&ObjectAttributes,&Name, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, 0, 0); Status = ZwCreateFile(Handle, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &ObjectAttributes, &Iosb, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,FILE_OPEN_IF,0, Ea, EaLength); *** Status 0 устройство "открылось" Status = ObReferenceObjectByHandle( *Handle, FILE_ANY_ACCESS, 0, KernelMode, pFileObject, NULL); *** BSODа нету Status = ObReferenceObjectByHandle( *Handle, FILE_ANY_ACCESS, 0, KernelMode, pTcpIpDevice, NULL); *** BSOD !!!! SocketsIrp = IoAllocateIrp(pTcpIpDevice->StackSize + 1, FALSE); может не тем способом пытаюсь получить DEVICE_OBJECT ?
Код (Text): RtlInitUnicodeString( &name, L"\\Device\\Tcp" ); status = IoGetDeviceObjectPointer( &name, FILE_READ_ATTRIBUTES, &pTargetFileObject, &pTargetDeviceObject );
Функция ObReferenceObjectByHandle() в качестве аргумента Object принимает следующие значения: Код (Text): ObjectType parameter Object pointer type *ExEventObjectType PKEVENT *ExSemaphoreObjectType PKSEMAPHORE *IoFileObjectType PFILE_OBJECT *PsProcessType PEPROCESS or PKPROCESS *PsThreadType PETHREAD or PKTHREAD *SeTokenObjectType PACCESS_TOKEN *TmEnlistmentObjectType PKENLISTMENT *TmResourceManagerObjectType PKRESOURCEMANAGER *TmTransactionManagerObjectType PKTM *TmTransactionObjectType PKTRANSACTION см. описание http://msdn.microsoft.com/en-us/library/ms802942.aspx как правильно написал C2H5OH, ноно использовать IoGetDeviceObjectPointer - она позволяет узнать и PDEVICE_OBJECT И PFILE_OBJECT
at0s Ты неправильно вызывал ф-ю. Нужно передавать в кач-ве последнего аргумента указатель на переменную void*. А ты что передавал? Ай яй яй
Great да согласен ) спасибо тогда еще вопрос в чем может быть причина, что нижеизложенный код постоянно возвращает STATUS_PENDING и следом STATUS_TIMEOUT где должна !!! сидеть ошибка ? (ссылка рабочая , под Vista, c WSK качает) Код (Text): //SocktTimeout = 5000; //SocktTimeout = 500000; //SocktTimeout = 50000000; //SocktTimeout = -50000000; SocktTimeout = -500000; .......... Connection = iSocket->ConnectionFile;// pFileObject memset (&RequestInfo,0, sizeof(TDI_CONNECTION_INFORMATION)); memset (&RemoteAddress,0,sizeof (TA_IP_ADDRESS)); RemoteAddress.TAAddressCount = 1; RemoteAddress.Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP; RemoteAddress.Address[0].AddressType = TDI_ADDRESS_TYPE_IP; RemoteAddress.Address[0].Address[0].sin_port = Port; RemoteAddress.Address[0].Address[0].in_addr = Address; RequestInfo.UserDataLength = 0; RequestInfo.UserData = NULL; RequestInfo.OptionsLength = 0; RequestInfo.Options = NULL; RequestInfo.RemoteAddressLength = sizeof(TA_IP_ADDRESS); RequestInfo.RemoteAddress = &RemoteAddress; // initialize event and device KeInitializeEvent(&Ctx.Event, NotificationEvent, FALSE); DeviceObject = pTcpIpDevice; Irp = IoAllocateIrp(DeviceObject->StackSize + 1, FALSE); TdiBuildConnect (Irp, DeviceObject,Connection,KSocketComplete, &Ctx, NULL, &RequestInfo, &RequestInfo); Status = IoCallDriver(DeviceObject, Irp); if (Status == STATUS_PENDING) { Status = KeWaitForSingleObject(&Ctx.Event, Executive, KernelMode, FALSE, &SockTimeout); if (Status == STATUS_TIMEOUT) { DbgPrint(" **** KSocketConnect timeout occurred ***** cancelling IRP\n"); IoCancelIrp(Irp); KeWaitForSingleObject(&Ctx.Event, Executive, KernelMode, FALSE, NULL); Status = STATUS_CONNECTION_ABORTED; } else Status = Ctx.Iosb.Status; } __asm int 3; if (Status == STATUS_SUCCESS) pSocket->Connected = TRUE;
Код (Text): RemoteAddress.Address[0].Address[0].sin_port = Port; RemoteAddress.Address[0].Address[0].in_addr = Address; Port & Address значения какие? У меня похожий код зависал именно на STATUS_TIMEOUT, потому что не мог понять, куда и на какой порт коннектиться. В остальном вроде все верно
#define IP4_ADDR(a,b,c,d) ((d<<24) | (c<<16) | (b<<8) | a) #define HOST_PORT 80 #define HOST_ADDRESS IP4_ADDR(207,56,113,28) Данные просмотрел прямо перед запросом TdiBuildConnect и проверил в ручную, здесь все правильно RemoteAddress.Address[0].Address[0].sin_port =0x50 RemoteAddress.Address[0].Address[0].in_addr = 0x1c7138cf
Еще одна особенность: код из 7-го поста работает только в пошаговом режеме дебагера а при F5 - STATUS_TIMEOUT я полагаю что-то не то с SockTimeout, и пока я вручную торможу - он работает Great будет "ругатся", но вместо LARGE_INTEGER я определил LONGLONG - это существенно ?
at0s >вместо LARGE_INTEGER я определил LONGLONG - это существенно ? Нет. Код (Text): LARGE_INTEGER SockTimeout1 = {-1, -100000000}; LONGLONG SockTimeout2 = -429496725305032705i64; SockTimeout1 и SockTimeout2 будут иметь одинаковое выравнивание и одинаковое битовое представление. (Да-да, на калькуляторе посчитали).