Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Связь приложения и драйвера по LPC.  (Прочитано 5119 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Treww
Гость
« : 18-07-2008 11:25 » 

Здравствуйте!

Помогите решить проблему при работе с LPC.

Приложение создает серверный порт и ждет подключений в отдельном потоке.
Клиент в пользовательском режиме подключается к серверу без проблем. Но если код клиента выполняется в драйвере, то
функция NtConnectPort возвращает ошибку 0xC000005.

В чем может быть проблема?

Код сервера:

Код:
  NTSTATUS stat = 0;
  LPC_DATA_MESSAGE msg;
  HANDLE Client = NULL;
  SECURITY_DESCRIPTOR sd;
  UNICODE_STRING portName;
  DWORD lastErr;

  if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
      return;

  if(!SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE))
      return;
 
  RtlInitUnicodeString(&portName, Name.c_str());
 
  OBJECT_ATTRIBUTES portAttr;
  InitializeObjectAttributes(&portAttr, &portName, OBJ_CASE_INSENSITIVE , NULL, &sd);
  size_t msgSize = sizeof(LPC_DATA_MESSAGE);
  stat = NtCreatePort(&Port, &portAttr, 0 , msgSize, 0);

  while(Stop == false)
  {
    stat = NtListenPort(Port, &msg.Header);
    stat = NtAcceptConnectPort(&Client, NULL,&msg.Header, TRUE, NULL, NULL);
    stat = NtCompleteConnectPort(Client);
    stat = NtReplyWaitReceivePort(Client, NULL, NULL, &msg.Header);
    ................
  }

Код клиента:

Код:
  NTSTATUS stat;
  UNICODE_STRING name;
  RtlInitUnicodeString(&name, portName);

  SECURITY_QUALITY_OF_SERVICE securityQos;
  securityQos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE);
  securityQos.ImpersonationLevel = SecurityAnonymous,
  securityQos.ContextTrackingMode = 0;
  securityQos.EffectiveOnly = 0;

   // в режиме ядра возвращается ошибка
  stat = NtConnectPort(&Port,
                       &name,
                       &securityQos,
                       NULL,
                       NULL,
                       0,
                       NULL,
                       NULL);
Записан
Treww
Гость
« Ответ #1 : 18-07-2008 14:45 » 

Проблему решил.

Соединение установилось в отдельном системном потоке потоке...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines