GINA:пропадает Logon диалог
От: Toughpheeckouse Россия  
Дата: 07.05.04 09:41
Оценка:
Привет!

Пишу свою GINу. Появилась проблема: призагрузке системы появлется логон диалог.
Если не чего не далеть, то примерно через 2 минуты он проподает. система не на что не реагирует.
Такая же проблема в примере GINA от майкрософта.
трассировка показала следущее:

13:15:02.656: 764.768> GINA-Trace: WlxNegotiate
13:15:02.671: 764.768> GINA-Trace: WlxInitialize
13:15:02.984: 764.768> GINA-Trace: WlxDisplaySASNotice
13:15:02.984: 764.768> GINA-Trace: WlxLoggedOutSAS
13:17:07.437: 764.768> GINA-Trace: WlxLogoff


кто вызвал WlxLogoff, и зачем?

подумал сначала, что это Screen Saver так действует. отключение не помогло.

OS: WinXP pro sp1

Что за беда такая?
Думайте сами, решайте сами...
Re: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 07.05.04 10:41
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>Привет!


T>Пишу свою GINу. Появилась проблема: призагрузке системы появлется логон диалог.

T>Если не чего не далеть, то примерно через 2 минуты он проподает. система не на что не реагирует.
T>Такая же проблема в примере GINA от майкрософта.

T>кто вызвал WlxLogoff, и зачем?


T>подумал сначала, что это Screen Saver так действует. отключение не помогло.


T>OS: WinXP pro sp1


T>Что за беда такая?


У меня была такая же фигня. Оказалось просто, что GDI объект один не освобождался, т.е. в message loop диалога работал CreateFont и создавал обьект Font, ну вот как только я стал его освобождать после использования — все стало ОК.

Так, что первое что стоит посмотреть это memory leaks!

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[2]: GINA:пропадает Logon диалог
От: Toughpheeckouse Россия  
Дата: 11.05.04 08:11
Оценка:
Здравствуйте, .Mistery, Вы писали:


M>У меня была такая же фигня. Оказалось просто, что GDI объект один не освобождался, т.е. в message loop диалога работал CreateFont и создавал обьект Font, ну вот как только я стал его освобождать после использования — все стало ОК.


M>Так, что первое что стоит посмотреть это memory leaks!


M>Удачи!


У меня нет утечек GDI объектов.
Причем, как я уже писал, пример GINы от майкрософта, имеет такой же эффект.
так и не могу понять в чем дело.
Думайте сами, решайте сами...
Re[3]: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 11.05.04 10:44
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>У меня нет утечек GDI объектов.

T>Причем, как я уже писал, пример GINы от майкрософта, имеет такой же эффект.

Примеры от Microsoft это конечно показатель, но я не первый раз встречаюсь с тем, что даже Microsoft примеры работают с глюками, это впринципе нормально когда пишутся довольно сложные вещи, ведь Microsoft не использует всякие там BoundCheckers, Compuware DevPartner Studio и так далее, ранг так сказать не позволяет пользоваться программами сторонних производителей Ну ладно, это так лирическое отступление.

T>так и не могу понять в чем дело.


Еще сталкивался с таким багом, что на моей машине не работает, а на виртуалке работает. И соответственно пробовал на нормальной машине с чистой виндой, тоже все Ок (это все про тоже пропадание диалогов). Черт его знает настройки может какие влияют или еще что — не научный конечно ответ для программиста , но я так и неразобрался в чем было дело.

Ок, ну я бы в такой ситуации поступил так: Создал бы простой диалог с двумя кнопками и пустой message loop (ну в смысле с обработкой всех необходимых событий ), ну типа такого (это я выдрал кусок из своей GINA, с кое какими сокращениями для облегчения чтения кода):


//  UserLogonDialogMessageLoop
BOOL CALLBACK UserLogonDialogMessageLoop( HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
    
    switch ( message ) 
    { 

        case WM_ERASEBKGND:
        {

            DEBUG_MSG_SECTION_BEGIN( "WM_ERASEBKGND..." );

            //  some code ...
            
            DEBUG_MSG_SECTION_END( "WM_ERASEBKGND...End" );
            
            return ( TRUE );
        };

        case WM_INITDIALOG: 
        {

            DEBUG_MSG_SECTION_BEGIN( "WM_INITDIALOG..." );
            
            //  some code ...

            DEBUG_MSG_SECTION_END( "WM_INITDIALOG...End" );

            return ( TRUE ); 

        };

        case WM_DRAWITEM:
        {

            DEBUG_MSG_SECTION_BEGIN( "WM_DRAWITEM..." );
            
            //  some code ...

            DEBUG_MSG_SECTION_END( "WM_DRAWITEM...End" );

            return ( TRUE );

        };

        case WM_PAINT:
        {

            DEBUG_MSG_SECTION_BEGIN( "WM_PAINT..." );

            PAINTSTRUCT ps;
            HDC hdcPaint = BeginPaint( hwndDlg, &ps );

            if ( !SUCCEEDED( DrawBitmapToContext( hwndDlg, IDB_LOGON_DIALOG_BACKGROUND ) ) )
            {
                DEBUG_MSG( "DrawBitmapToContext failed" );
                break;
            };

            EndPaint( hwndDlg, &ps );

            DEBUG_MSG_SECTION_END( "WM_PAINT...End" );

            return ( FALSE ); 

        };

        case WM_COMMAND: 
        {

            switch ( LOWORD( wParam ) ) 
            { 
            
                case ID_LOGIN:
                {

                    DEBUG_MSG_SECTION_BEGIN( "ID_LOGIN..." );
            
                    //  some code ...

                    DEBUG_MSG_SECTION_END( "ID_LOGIN...End" );

                    return ( FALSE );

                };

                case IDC_LOGON_CANCEL:
                {

                    DEBUG_MSG_SECTION_BEGIN( "IDC_LOGON_CANCEL..." );
            
                    DestroyWindow( hwndDlg ); 

                    DEBUG_MSG_SECTION_END( "IDC_LOGON_CANCEL...End" );
                    
                    return ( FALSE );

                };

            };

        };
        
    };

    return ( FALSE );

};


WlxDisplaySASNotice:

    INT nDummyResult = pgContext->pWlxFuncs->WlxDialogBoxParam( pgContext->hWlx, pgContext->hDllInstance,
        MAKEINTRESOURCE( IDD_USER_LOGON_DIALOG ), NULL, UserLogonDialogMessageLoop, 
        reinterpret_cast < LPARAM > ( pgContext ) );


Ну и посмотреть как поведет себя такой код, я думаю что все будет Ок и ничего пропадать не станет. Если так значит всетаки какие то проблемы у тебя в message loop диалога, а вот если нет тогда нужно ловить ту тварь которая посылает SAS винлогону. Это вероятно самый не простой способ узнать кто портит погоду, нужно перехватывать вызов API функции ExitWindow с флагом EX_LOGOFF и потом посмотреть какой процесс это делает, может это сможет навести на какие нибудь мысли.

Если уж сильно нужно будет, для чистоты эксперемента, могу выслать тебе свою GINA, запустишь ее и посмотрим будет у меня диалог пропадать или нет!

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re: GINA:пропадает Logon диалог
От: Vladimir_the_Red_Sunny  
Дата: 11.05.04 11:26
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>Привет!


T>Пишу свою GINу. Появилась проблема: призагрузке системы появлется логон диалог.

T>Если не чего не далеть, то примерно через 2 минуты он проподает. система не на что не реагирует.
T>Такая же проблема в примере GINA от майкрософта.
T>трассировка показала следущее:

T>

T>13:15:02.656: 764.768> GINA-Trace: WlxNegotiate
T>13:15:02.671: 764.768> GINA-Trace: WlxInitialize
T>13:15:02.984: 764.768> GINA-Trace: WlxDisplaySASNotice
T>13:15:02.984: 764.768> GINA-Trace: WlxLoggedOutSAS
T>13:17:07.437: 764.768> GINA-Trace: WlxLogoff


T>кто вызвал WlxLogoff, и зачем?


T>подумал сначала, что это Screen Saver так действует. отключение не помогло.


T>OS: WinXP pro sp1


T>Что за беда такая?


Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?

Если да, то у меня было что-то похожее. Проверял всевозможные утечки памяти и ресурсов, не обнаружил. Нашел следующее решение проблемы.

Значит, комп если долго не трогать, он начинает засыпать. При засыпании он логоффится, блокируется, и еще там всякая фигня. Но в моей джине не работало путём: рабочий стол очищался, и так всё замирало. Я вёл debug-лог, там было видно, что в этом зависании фактически вызывается раз за разом WlxScreenSaverNotify, и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае. Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала. Как я понял (могу жестоко ошибаться), проблема была в том, что эти диалоги убиваются каким-то своим особым винлогоновским способом (то ли по SAS-event'у, то ли еще как), и одновременно с этим прекращается работа Wlx-функции, которая этот диалог отобразила. Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.

Не знаю, решение это проблемы, или кривой обход — но с виду вроде как помогло
Re[4]: GINA:пропадает Logon диалог
От: Toughpheeckouse Россия  
Дата: 11.05.04 12:10
Оценка:
Здравствуйте, .Mistery, Вы писали:


M>Еще сталкивался с таким багом, что на моей машине не работает, а на виртуалке работает. И соответственно пробовал на нормальной машине с чистой виндой, тоже все Ок (это все про тоже пропадание диалогов). Черт его знает настройки может какие влияют или еще что — не научный конечно ответ для программиста , но я так и неразобрался в чем было дело.


M>Ок, ну я бы в такой ситуации поступил так: Создал бы простой диалог с двумя кнопками и пустой message loop (ну в смысле с обработкой всех необходимых событий ), ну типа такого (это я выдрал кусок из своей GINA, с кое какими сокращениями для облегчения чтения кода):


да у меня в принцепе то так и есть, только не чистый Win API, а ATL к этому прикручен.

вот OnInitDialog:

LRESULT CLogonDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    m_Context = (CWlxContext*)(lParam);
    ATLASSERT(m_Context != NULL);

    CWindow UserName    = GetDlgItem(IDC_USERNAME_TEXT);
    CWindow UserDomain    = GetDlgItem(IDC_USERDOMAIN_COMBO);

    UserName.SetWindowText( m_Context->m_UserName );

    int Index = (int)UserDomain.SendMessage(CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)(LPCTSTR)m_Context->m_UserDomain);
    if (Index == CB_ERR)
    {
        Index = (int)UserDomain.SendMessage(CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)m_Context->m_UserDomain);
    }

    UserDomain.SendMessage(CB_SETCURSEL, (WPARAM)Index, 0);

    CWindow UserPassword = GetDlgItem(IDC_USERPSW_TEXT);
    UserPassword.SetFocus();

    CenterWindow();
    SetForegroundWindow(m_hWnd);
    return 0;
}

template <class T, class TBase  = CWindow >
class CWlxDialogImpl : public CDialogImpl<T, TBase>
{
...
    int DoModal(HWND hWndParent, LPARAM dwInitParam)
    {
        ATLASSERT(m_hWnd == NULL);
        ATLASSERT(m_hWlx != NULL);
        ATLASSERT(m_hInstance != NULL);
        ATLASSERT(m_WlxFuncs != NULL);

        _AtlWinModule.AddCreateWndData(&m_thunk.cd, (CDialogImplBaseT< TBase >*)this);

#ifdef _DEBUG
        m_bModal = true;
#endif //_DEBUG
        return m_WlxFuncs->WlxDialogBoxParam( m_hWlx, m_hInstance, (LPTSTR) MAKEINTRESOURCE(T::IDD), hWndParent, 
            (DLGPROC)T::StartDialogProc, (LPARAM)dwInitParam );
    }
...
}

int WINAPI WlxLoggedOutSAS(...)
{
...
    CLogonDlg Logon(hGlobalWlx, hDllInstance, pWlxFuncs);
    RetVal = Logon.DoModal(NULL, (LPARAM)Context);
...
}


и все. нет никаких GDI объектов и так дале.. меседж луп я тоже не засоряю.


M>Если уж сильно нужно будет, для чистоты эксперемента, могу выслать тебе свою GINA, запустишь ее и посмотрим будет у меня диалог пропадать или нет!


давай, если не трудно мыло профайле.
Думайте сами, решайте сами...
Re[2]: GINA:пропадает Logon диалог
От: Toughpheeckouse Россия  
Дата: 11.05.04 12:15
Оценка:
Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:


V__>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?


ты это, хорош тут на Вы! тут вам не там! )
давай на ты! ок?

ну не зависает, а просто не раегирует, на CAD и тд. Num Lock и Caps работают

ага, WlxDisplaySASNotice поустой.

но в WlxLogoff, есть вот такое
pWlxFuncs->WlxSasNotify(hGlobalWlx, GINA_LOGOFF_NOTIFY);
это, что бы после логофа вызволась WlxLoggedOutSAS, с dwSasType == GINA_LOGOFF_NOTIFY.

V__>Если да, то у меня было что-то похожее. Проверял всевозможные утечки памяти и ресурсов, не обнаружил. Нашел следующее решение проблемы.


V__>Значит, комп если долго не трогать, он начинает засыпать. При засыпании он логоффится, блокируется, и еще там всякая фигня. Но в моей джине не работало путём: рабочий стол очищался, и так всё замирало. Я вёл debug-лог, там было видно, что в этом зависании фактически вызывается раз за разом WlxScreenSaverNotify, и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае. Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала. Как я понял (могу жестоко ошибаться), проблема была в том, что эти диалоги убиваются каким-то своим особым винлогоновским способом (то ли по SAS-event'у, то ли еще как), и одновременно с этим прекращается работа Wlx-функции, которая этот диалог отобразила. Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.


про трейсу видно, что WlxScreenSaverNotify не вызывается, да если бы вызывалась, то вернулось бы FALSE.

V__>Не знаю, решение это проблемы, или кривой обход — но с виду вроде как помогло
Думайте сами, решайте сами...
Re[2]: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 11.05.04 12:16
Оценка:
Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:

V__>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?


Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера. ТОлько нельзя забывать, что когда основной поток будет ползать по message loop диалога, вполне может возникнуть какой нибудь SAS и winlogon вызовет соответствующую ф-ю GINA в другом потоке. Это остается на контроле программиста, что делать в данном случае, я в таких случаях всегда возвращал WLX_SAS_ACTION_NONE, а весь контроль держал сам в диалоге.

V__>Если да, то у меня было что-то похожее. Проверял всевозможные утечки памяти и ресурсов, не обнаружил. Нашел следующее решение проблемы.


V__>Значит, комп если долго не трогать, он начинает засыпать. При засыпании он логоффится, блокируется, и еще там всякая фигня.Но в моей джине не работало путём: рабочий стол очищался, и так всё замирало. Я вёл debug-лог, там было видно, что в этом зависании фактически вызывается раз за разом WlxScreenSaverNotify,


Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.

V__>и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае.


WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.

V__>Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала.


Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.

V__>Как я понял (могу жестоко ошибаться), проблема была в том, что эти диалоги убиваются каким-то своим особым винлогоновским способом (то ли по SAS-event'у, то ли еще как), и одновременно с этим прекращается работа Wlx-функции, которая этот диалог отобразила.


Верно! Но это не проблема, а Winlogon так работает, он посылает диалогу, отображенному ф-ей GINA, сообщение WLX_WM_SAS.

MSDN:
Winlogon sends messages to the GINA while dialog boxes are displayed. These messages are all encapsulated 
in the WLX_WM_SAS message.

For time-outs and logoffs, Winlogon will end the dialog after the message has been sent. This message is sent so 
the dialog can respond in a useful manner (for example, by closing itself down if a logoff has occurred). For logoffs, 
the dialog is ended with the code WLX_DLG_USER_LOGOFF.


V__>Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.


Именно так оно и работает, это нужно самому контролировать.

V__>Не знаю, решение это проблемы, или кривой обход — но с виду вроде как помогло


Как я уже сказал можно просто возвращать везде FALSE и говорить о том что никаких display messages мы не отображаем и тогда вышеописанная проблема отпадает сама собой.

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[3]: GINA:пропадает Logon диалог
От: Toughpheeckouse Россия  
Дата: 11.05.04 12:24
Оценка:
Здравствуйте, .Mistery, Вы писали:

M>Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:


V__>>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?


M>Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера.

не согласен. там должно показхываться приведствие (или быть пустой), а logon dialog должен показываться в WlxLoggedOutSAS.

M>Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.

так и есть.

M>WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.

и так тоже.

M>Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.

+1
Думайте сами, решайте сами...
Re[5]: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 11.05.04 13:38
Оценка: 12 (1)
Здравствуйте, Toughpheeckouse, Вы писали:

T>да у меня в принцепе то так и есть, только не чистый Win API, а ATL к этому прикручен.


А я к сожалению в ATL пока не очень разбираюсь. Если нужно будет разберемся!

T>вот OnInitDialog:


T>
T>LRESULT CLogonDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
T>{
T>    m_Context = (CWlxContext*)(lParam);
T>    ATLASSERT(m_Context != NULL);

T>    CWindow UserName    = GetDlgItem(IDC_USERNAME_TEXT);
T>    CWindow UserDomain    = GetDlgItem(IDC_USERDOMAIN_COMBO);

T>    UserName.SetWindowText( m_Context->m_UserName );

T>    int Index = (int)UserDomain.SendMessage(CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)(LPCTSTR)m_Context->m_UserDomain);
T>    if (Index == CB_ERR)
T>    {
T>        Index = (int)UserDomain.SendMessage(CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)m_Context->m_UserDomain);
T>    }

T>    UserDomain.SendMessage(CB_SETCURSEL, (WPARAM)Index, 0);

T>    CWindow UserPassword = GetDlgItem(IDC_USERPSW_TEXT);
T>    UserPassword.SetFocus();

T>    CenterWindow();
T>    SetForegroundWindow(m_hWnd);
T>    return 0;
T>}

T>template <class T, class TBase  = CWindow >
T>class CWlxDialogImpl : public CDialogImpl<T, TBase>
T>{
T>...
T>    int DoModal(HWND hWndParent, LPARAM dwInitParam)
T>    {
T>        ATLASSERT(m_hWnd == NULL);
T>        ATLASSERT(m_hWlx != NULL);
T>        ATLASSERT(m_hInstance != NULL);
T>        ATLASSERT(m_WlxFuncs != NULL);

T>        _AtlWinModule.AddCreateWndData(&m_thunk.cd, (CDialogImplBaseT< TBase >*)this);

T>#ifdef _DEBUG
T>        m_bModal = true;
T>#endif //_DEBUG
T>        return m_WlxFuncs->WlxDialogBoxParam( m_hWlx, m_hInstance, (LPTSTR) MAKEINTRESOURCE(T::IDD), hWndParent, 
T>            (DLGPROC)T::StartDialogProc, (LPARAM)dwInitParam );
T>    }
T>...
T>}


Да вроде все красиво!

T>int WINAPI WlxLoggedOutSAS(...)
T>{
T>...
T>    CLogonDlg Logon(hGlobalWlx, hDllInstance, pWlxFuncs);
T>    RetVal = Logon.DoModal(NULL, (LPARAM)Context);
T>...
T>}
T>


Ах, всетаки не уверен, что это правильно, WlxDisplaySASNotice.

T>и все. нет никаких GDI объектов и так дале.. меседж луп я тоже не засоряю.


M>>Если уж сильно нужно будет, для чистоты эксперемента, могу выслать тебе свою GINA, запустишь ее и посмотрим будет у меня диалог пропадать или нет!


T>давай, если не трудно мыло профайле.


Отправил, лови на мыле!

Удачи!
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[4]: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 11.05.04 13:44
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>Здравствуйте, .Mistery, Вы писали:


M>>Здравствуйте, Vladimir_the_Red_Sunny, Вы писали:


V__>>>Появляется диалог логона. Если не логиниться, и вообще его не трогать, то через две минуты он исчезает сам, а комп "зависает"? В этом проблема? А WlxDisplaySASNotice пустая у Вас?


M>>Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера.

T>не согласен. там должно показхываться приведствие (или быть пустой), а logon dialog должен показываться в WlxLoggedOutSAS.

Наверное мы не так друг друга поняли или обьяснили друг другу неправильно. Да если речь идет именно о диалоги логина юзера то конечно мы должны его вывести после получения SAS, например CTRL-ALT-DEL

MSDN:
The WlxLoggedOutSAS Winlogon calls this function when it receives an SAS event while no user is logged on.


У меня просто сделано немного не так. В WlxDisplaySASNotice проходит весь цикл жизни всех диалогов, после долгих эксперементов это оказалось разумным.

MSDN:
The WlxDisplaySASNotice Winlogon calls this function when no user is logged on.


Потому как, а что делать если есть заставка winlogon, и пока еще WlxLoggedOutSAS не сработал, а user захотел выключить комп или перезагрузить? Или тебе нужно среагировать на какие либо события WM_DEVICECHANGE например и проверить какой нибудь девайс, например SMARTCARD или еще чего нибудь. Как ты это обработаешь? А у меня это работает так. В WlxDisplaySASNotice работает DUMMY диалог у которого есть только кнопка выключения, через которую можно вызвать диалог с тремя кнопками (Stand BY, Restart, Shutdown). Выглядит это так ка у MS GINA при загрузке компа, внизу кнопочка выключения. А так же при данном подходе у тебя работает message loop в котором ты ловишь все event которые тебе нужны, такие например как WM_DEVICECHANGE и т.д. В итоге получаешь более гибкий контроль. И диалог логина юзера уже запускается и message loop этого dummy диалога.

M>>Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.

T>так и есть.

M>>WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.

T>и так тоже.

M>>Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.

T>+1
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[6]: GINA:пропадает Logon диалог
От: Toughpheeckouse Россия  
Дата: 11.05.04 15:14
Оценка:
Здравствуйте, .Mistery, Вы писали:


M>Отправил, лови на мыле!


M>Удачи!


Вобщем я воспользовался твоим советом.
Сделал что бы Logon даилог показывался в WlxDisplaySASNotice.
Вроде как работает.
Но непонимание, почему не работает в WlxLoggedOutSAS осталось!

Спасибо!

ЗЫ:
ты бы сделал в своем логон диалоге, что бы таб работал
и еще, у тебя не инициализирутся переменные коружения типа USERNAME и тд.
Думайте сами, решайте сами...
Re[7]: GINA:пропадает Logon диалог
От: .Mistery Беларусь  
Дата: 11.05.04 15:25
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>Но непонимание, почему не работает в WlxLoggedOutSAS осталось!


У меня тоже!

T>Спасибо!


Да незачто!

T>ЗЫ:

T>ты бы сделал в своем логон диалоге, что бы таб работал
T>и еще, у тебя не инициализирутся переменные коружения типа USERNAME и тд.

Ну да, там еще много чего нужно было бы сделать, так это пока рабочий прототип, до готового продукта ему далеко.
... << RSDN@Home 1.1.3 beta 1 >>
Мы — маньяки, должны помогать друг другу!
Re[3]: GINA:пропадает Logon диалог
От: Vladimir_the_Red_Sunny  
Дата: 12.05.04 07:03
Оценка:
Здравствуйте, .Mistery, Вы писали:

M>Она не должна быть пустая, в ней как раз то и должен выводится диалог логина юзера. ТОлько нельзя забывать, что когда основной поток будет ползать по message loop диалога, вполне может возникнуть какой нибудь SAS и winlogon вызовет соответствующую ф-ю GINA в другом потоке. Это остается на контроле программиста, что делать в данном случае, я в таких случаях всегда возвращал WLX_SAS_ACTION_NONE, а весь контроль держал сам в диалоге.


У меня в WlxDisplaySASNotice выводилось предложение нажать Ctrl+Alt+del, а диалог логина — в WlxLoggedOutSAS. Это чем-то неправильно?

M>Если в WlxScreenSaverNotify вернуть FALSE то никаких засыпаний не будет.


Категорически утверждать не возьмусь, потому что не помню, но, кажется, он почему-то все равно засыпал...

V__>>и еще, кажется, какая-то функция, ответственная за вывод диалога с сообщением в этом случае.


M>WlxDisplayStatusMessage, возвращаем FALSE и winlogon знает что никаких messages небыло отображено.


V__>>Щас не помню деталей, некоторое время не работал над этим проектом. Так вот, во все пустые функции WlxЧё-ТоТам, которые должны/могут отображать диалог с сообщением, я запихнул по диалогу, и проблема пропала.


M>Они не должны быть пустые, т.е. хотябы TRUE или FALSE они должны возвращать. И запихивать туда диалоги вовсе не обязательно.


Посмотрел. Бесконечно вызывалась функция WlxDisplayLockedNotice. Возвращать тру-фолс она не могёт, ибо воид.

V__>>Пока диалог (модальный!) существует, Wlx-функция работает. Пришел евент — умирает вместе с диалогом. Но если она (или диалог) закончили работу по каким-то другим причинам (напр. нажали ОК на диалоге, или вовсе его не создавали) — функция сразу же снова вызывается. Infinite loop. Отображением диалога я ее как бы "стопорил", чтобы вызывалась единожды.


M>Именно так оно и работает, это нужно самому контролировать.


А как?

M>Как я уже сказал можно просто возвращать везде FALSE и говорить о том что никаких display messages мы не отображаем и тогда вышеописанная проблема отпадает сама собой.


Так не всякая функция что-то возвращает...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.