BSOD при ObReferenceObjectByHandle

Тема в разделе "WASM.NT.KERNEL", создана пользователем at0s, 27 фев 2010.

  1. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Доброго времени суток

    XP SP2
    Пытаюсь получить DEVICE_OBJECT для TcpIpDevice

    Код (Text):
    1. PDEVICE_OBJECT          pTcpIpDevice;
    2. PFILE_OBJECT              pFileObject
    3. ......
    4. RtlInitUnicodeString(&Name, TCPIP_DEVICE);
    5. InitializeObjectAttributes(&ObjectAttributes,&Name,
    6.                     OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, 0, 0);
    7. Status = ZwCreateFile(Handle, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &ObjectAttributes, &Iosb, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,FILE_OPEN_IF,0, Ea,   EaLength);
    8.                         ***      Status 0 устройство "открылось"
    9. Status = ObReferenceObjectByHandle( *Handle, FILE_ANY_ACCESS, 0, KernelMode,
    10. pFileObject,  NULL);           ***       BSODа  нету    
    11. Status = ObReferenceObjectByHandle( *Handle, FILE_ANY_ACCESS, 0, KernelMode,
    12. pTcpIpDevice, NULL);         ***       BSOD  !!!!
    13.  
    14. SocketsIrp = IoAllocateIrp(pTcpIpDevice->StackSize + 1, FALSE);
    может не тем способом пытаюсь получить DEVICE_OBJECT ?
     
  2. C2H5OH

    C2H5OH New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    42
    Код (Text):
    1. RtlInitUnicodeString( &name, L"\\Device\\Tcp" );
    2. status = IoGetDeviceObjectPointer(
    3.                &name,
    4.                FILE_READ_ATTRIBUTES,
    5.                &pTargetFileObject,
    6.                &pTargetDeviceObject );
     
  3. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    &pFileObject
     
  4. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    Функция ObReferenceObjectByHandle() в качестве аргумента Object принимает следующие значения:
    Код (Text):
    1. ObjectType parameter    Object pointer type
    2. *ExEventObjectType  PKEVENT
    3. *ExSemaphoreObjectType  PKSEMAPHORE
    4. *IoFileObjectType   PFILE_OBJECT
    5. *PsProcessType  PEPROCESS or PKPROCESS
    6. *PsThreadType   PETHREAD or PKTHREAD
    7. *SeTokenObjectType  PACCESS_TOKEN
    8. *TmEnlistmentObjectType PKENLISTMENT
    9. *TmResourceManagerObjectType    PKRESOURCEMANAGER
    10. *TmTransactionManagerObjectType PKTM
    11. *TmTransactionObjectType    PKTRANSACTION
    см. описание http://msdn.microsoft.com/en-us/library/ms802942.aspx

    как правильно написал C2H5OH, ноно использовать IoGetDeviceObjectPointer - она позволяет узнать и PDEVICE_OBJECT И PFILE_OBJECT
     
  5. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Спасибо всем
    IoGetDeviceObjectPointer помог :)
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    at0s
    Ты неправильно вызывал ф-ю. Нужно передавать в кач-ве последнего аргумента указатель на переменную void*.
    А ты что передавал? Ай яй яй
     
  7. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Great
    да согласен )
    спасибо

    тогда еще вопрос в чем может быть причина, что нижеизложенный код постоянно возвращает STATUS_PENDING и следом STATUS_TIMEOUT
    где должна !!! :) сидеть ошибка ?
    (ссылка рабочая , под Vista, c WSK качает)

    Код (Text):
    1. //SocktTimeout = 5000;
    2. //SocktTimeout = 500000;
    3. //SocktTimeout = 50000000;
    4. //SocktTimeout = -50000000;
    5. SocktTimeout = -500000;
    6. ..........
    7.     Connection = iSocket->ConnectionFile;//  pFileObject
    8.     memset (&RequestInfo,0, sizeof(TDI_CONNECTION_INFORMATION));
    9.     memset (&RemoteAddress,0,sizeof (TA_IP_ADDRESS));
    10.    
    11.     RemoteAddress.TAAddressCount = 1;
    12.     RemoteAddress.Address[0].AddressLength = TDI_ADDRESS_LENGTH_IP;
    13.     RemoteAddress.Address[0].AddressType = TDI_ADDRESS_TYPE_IP;
    14.     RemoteAddress.Address[0].Address[0].sin_port = Port;
    15.     RemoteAddress.Address[0].Address[0].in_addr = Address;
    16.    
    17.     RequestInfo.UserDataLength = 0;
    18.     RequestInfo.UserData = NULL;
    19.     RequestInfo.OptionsLength = 0;
    20.     RequestInfo.Options = NULL;
    21.     RequestInfo.RemoteAddressLength = sizeof(TA_IP_ADDRESS);
    22.     RequestInfo.RemoteAddress = &RemoteAddress;
    23.    
    24.     // initialize event and device
    25.     KeInitializeEvent(&Ctx.Event, NotificationEvent, FALSE);    
    26.     DeviceObject = pTcpIpDevice;
    27.  
    28.     Irp = IoAllocateIrp(DeviceObject->StackSize + 1, FALSE);
    29.  
    30.     TdiBuildConnect (Irp, DeviceObject,Connection,KSocketComplete, &Ctx,
    31.                                                           NULL, &RequestInfo, &RequestInfo);
    32.     Status = IoCallDriver(DeviceObject, Irp);
    33.     if (Status == STATUS_PENDING)
    34.     {
    35.         Status = KeWaitForSingleObject(&Ctx.Event, Executive, KernelMode,
    36.                                                                          FALSE, &SockTimeout);
    37.         if (Status == STATUS_TIMEOUT)
    38.         {
    39.             DbgPrint(" **** KSocketConnect timeout occurred ***** cancelling IRP\n");
    40.             IoCancelIrp(Irp);
    41.             KeWaitForSingleObject(&Ctx.Event, Executive, KernelMode, FALSE, NULL);
    42.             Status = STATUS_CONNECTION_ABORTED;
    43.         }
    44.         else  
    45.                Status = Ctx.Iosb.Status;
    46.     }
    47.     __asm int 3;
    48.     if (Status == STATUS_SUCCESS)
    49.         pSocket->Connected = TRUE;
     
  8. C2H5OH

    C2H5OH New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    42
    Код (Text):
    1.     RemoteAddress.Address[0].Address[0].sin_port = Port;
    2.     RemoteAddress.Address[0].Address[0].in_addr = Address;
    Port & Address значения какие?
    У меня похожий код зависал именно на STATUS_TIMEOUT, потому что не мог понять, куда и на какой порт коннектиться.
    В остальном вроде все верно
     
  9. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    #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
     
  10. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    C2H5OH
    ты еще раз оказался прав :)
    просто 0x50 очень похоже на 0x5000, упустил "мелочь" HTONS (port)
     
  11. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Еще одна особенность: код из 7-го поста работает только в пошаговом режеме дебагера
    а при F5 - STATUS_TIMEOUT
    я полагаю что-то не то с SockTimeout, и пока я вручную торможу - он работает
    Great будет "ругатся", но вместо LARGE_INTEGER я определил
    LONGLONG - это существенно ?
     
  12. at0s

    at0s New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2009
    Сообщения:
    91
    Отвечаю сам - ДА
    STATUS_TIMEOUT исчез, когда выставил
    LARGE_INTEGER SockTimeout={-1,-100000000};
     
  13. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    at0s
    >вместо LARGE_INTEGER я определил LONGLONG - это существенно ?
    Нет.

    Код (Text):
    1. LARGE_INTEGER SockTimeout1 = {-1, -100000000};
    2. LONGLONG SockTimeout2 = -429496725305032705i64;
    SockTimeout1 и SockTimeout2 будут иметь одинаковое выравнивание и одинаковое битовое представление. (Да-да, на калькуляторе посчитали).