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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись звука до входа пользователя в систему  (Прочитано 9118 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Sergey
Интересующийся

ru
Offline Offline

« : 01-12-2013 12:10 » 

Доброго времени суток!
Передо мной стоит задача создания авторизации в систему(ОС Windows XP) посредством голоса(идентификация по голосу). В связи с этим есть необходимость записи голоса пользователя. Для записи использую функции семейства waveIn...Проблема заключается в том, что до входа в систему (в обертке к msgina.dll) эти функции выдают ошибки. Что можно предпринять?
Записан
zubr
Гость
« Ответ #1 : 01-12-2013 13:39 » 

Ну, ntdll уже загружена, так что можно загрузить нужные библиотеки, юзая LdrLoadLibrary
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 01-12-2013 16:42 » 

Sergey, можно реализовать сервис, работающий с достаточно высокими правами (допустим, LocalSystem), чтобы иметь доступ к любым прикладным функциям. Однако если эти функции как-то связаны с сессией и рабочим столом, то придётся разыскивать процесс winlogon.exe и через дублирование его токенов получать доступ к его сессии и завязанным на неё функциям.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergey
Интересующийся

ru
Offline Offline

« Ответ #3 : 01-12-2013 18:45 » 

... придётся разыскивать процесс winlogon.exe и через дублирование его токенов получать доступ к его сессии и завязанным на неё функциям.
Если ничего не путаю, Винлогон сам передаёт в msgina.dll свой токен, который можно сохранить...А как его использовать?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 01-12-2013 18:57 » 

Sergey, я же написал "если". Если ни для каких целей (например, доступа к функциям) токен не нужен, то не нужен.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sergey
Интересующийся

ru
Offline Offline

« Ответ #5 : 01-12-2013 19:15 » 

Сразу прошу извинить меня за моё незнание, а где-то может и глупость... Но попробую ещё задавать вопросы. Т.е. я правильно понимаю, что вызов функций заканчивается неудачей из-за того, что нужные компоненты системы ещё не загружены? И следует загрузить необходимые dll библиотеки, как советует Zubr, используя функцию LdrLoadLibrary?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 01-12-2013 20:15 » 

Sergey, непонятно, что такое "неудача вызова функции".

Возникает исключительная ситуация?
Или функция возвращает ошибку?

Какая это исключительная ситуация (что содержит объект описания исключения)? Или какая конкретно возвращается ошибка? В документации в общем-то ошибки перечислены.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zubr
Гость
« Ответ #7 : 01-12-2013 21:07 » 

winlogon система загружает как нативный процесс, а там еще большинства библиотек нет, в том числе даже кернел32
Записан
Sergey
Интересующийся

ru
Offline Offline

« Ответ #8 : 08-12-2013 09:53 » 

Чтобы проще было определить ошибки, решил воспользоваться "интерфейсом управляющих строк":
Код: (C++)
        TCHAR Text_err[MAX_PATH];
        MCIERROR Res = 0;
       
        //Открытие устройства для записи
        if(Res = mciSendString(TEXT("open new type waveaudio alias rec wait"), NULL, 0, NULL))
        {
                if(!mciGetErrorString(Res, Text_err, MAX_PATH))
                {
                        MessageBox(0, TEXT("Open waveaudio unknown error!"),  TEXT("Open error"), 0);
                }
                MessageBox(0, Text_err,  TEXT("Open error"), 0);
                return 1;
        }

        MessageBox(0, TEXT("Open waveaudio OK!"),  TEXT("Внимание!"), 0);

/*     
        //Установка параметров записи
        if(Res = mciSendString(TEXT("set rec bitspersample 16 channels 1 samplespersec 44100"), NULL, 0, NULL))
        {
                if(!mciGetErrorString(Res, Text_err, MAX_PATH))
                {
                        MessageBox(0, TEXT("Set settings unknown error!"),  TEXT("Set settings"), 0);
                }
                MessageBox(0, Text_err,  TEXT("Set settings!"), 0);
                return 3;
        }

        MessageBox(0, TEXT("Set settings OK!"),  TEXT("Settings error"), 0);
*/


        //Запуск записи
        if(Res = mciSendString(TEXT("record rec"), NULL, 0, NULL))
        {
                if(!mciGetErrorString(Res, Text_err, MAX_PATH))
                {
                        MessageBox(0, TEXT("Start record unknown error!"),  TEXT("Start error"), 0);
                }
                MessageBox(0, Text_err,  TEXT("Start error"), 0);
                return 4;
        }

        MessageBox(0, TEXT("Start record OK!"),  TEXT("Start"), 0);

        Sleep(1000);

        //Остановка записи
        if(Res = mciSendString(TEXT("stop rec"), NULL, 0, NULL))
        {
                if(!mciGetErrorString(Res, Text_err, MAX_PATH))
                {
                        MessageBox(0, TEXT("Stop record unknown error!"),  TEXT("Stop"), 0);
                }
                MessageBox(0, Text_err,  TEXT("Stop error"), 0);
                return 5;
        }

        MessageBox(0, TEXT("Stop record OK!"),  TEXT("Stop"), 0);

        //Сохранение записи в файл
        if(Res = mciSendString(TEXT("save rec \"D:\\temp.wav\""), NULL, 0, NULL))
        {
                if(!mciGetErrorString(Res, Text_err, MAX_PATH))
                {
                        MessageBox(0, TEXT("Save record unknown error!"),  TEXT("Save"), 0);
                }
                MessageBox(0, Text_err,  TEXT("Save error"), 0);
                return 6;
        }

        MessageBox(0, TEXT("Save record OK!"),  TEXT("Save"), 0);


        //закрытие устройства записи
        if(Res = mciSendString(TEXT("close rec"), NULL, 0, NULL))
        {
                if(!mciGetErrorString(Res, Text_err, MAX_PATH))
                {
                        MessageBox(0, TEXT("Close unknown error!"),  TEXT("Close"), 0);
                }
                MessageBox(0, Text_err,  TEXT("Close error"), 0);
                return 7;
        }

        MessageBox(0, TEXT("Close OK!"),  TEXT("Close"), 0);

Открытие устройства проходит успешно. Ошибка возникла при установке параметров со следующим сообщением: "Указанный параметр команды не распознан драйвером". Думал, что ошибся при написании команды, проверил - вроде всё правильно, менял сами параметры: частоту дискретизации и т.д. Потом решил попробовать не устанавливать параметры "вручную". Теперь возникла ошибка при запуске записи, со следующим сообщением: "Не установлено ни одного устройства, позволяющего записать файлы в текущем формате. Для установки звукового устройства откройте панель управления, щелкните "принтеры и другое оборудование", а затем "Установка оборудования"".
Насчет инициализации звуковой карты и загрузки драйверов звука - прочитал(в интернете), что звуковая карта инициализируется ещё во время заставки "Windows XP" при включении, с характерными щелчками динамиков.
Еще узнал, что за звук в ОС отвечает служба Windows Audio, которая запускается автоматически. Прочитал про порядок загрузки драйверов и служб, узнал, что Windows Audio относится к группе AudioGroup(логично), зависит от служб Plug and Play и RPC. Поставил загрузку Windows Audio в реестре сразу после P&P, которая идёт гораздо позже RPC. Получается, что WinAudio всё равно загружается раньше входа пользователя в систему. Но запись звука не работает...   
Записан
zubr
Гость
« Ответ #9 : 08-12-2013 11:51 » new

На самом деле скорее всего ничего не изменилось в порядке загрузки драйверов после твоих изменений в реестре.
Если посмотреть сервис содержащий audio group - то это %SystemRoot%\System32\svchost.exe -k netsvcs
Насколько я помню, в состав аудио драйверов входит несколько драйверов и один из них - Kmixer.sys (отвечает за DirectSound)

Но главное:
Цитата
There are two methods that you can use to control the order in which device drivers load. Both methods take advantage of entries in the registry that can be found at \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control. The first method is to modify the ServiceGroupOrder. The second method is to assign Tag values that determine the order of driver loading according to the GroupOrderList. The tag values start type and Group names are in the HKLM\SYSTEM\CurrentControlSet\Services\<drivername> key which must be added before the values can be listed in the Group Order List.

These two methods only work for device drivers that have a start value of 0 (SERVICE_BOOT_START) or 1 (SERVICE_SYSTEM_START). In all cases, device drivers with a start value of 0 load before any device drivers with a start value of 1 attempt to load.
Источник msdn. Специально выделил жирным шрифтом ключевую фразу.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines