Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
ну блин 05.05.06 14:04 Число просмотров: 3414
Автор: z0 <z0> Статус: Member
|
> Не производит. И lsass.exe и rpc-серверы (в svchost.exe с > соответствующими dll-ками) запускаются как сервисы. А любой > сервис в своей ServiceMain должен проинициализировать > таблицу SERVICE_TABLE_ENTRY-ей и вызвать > StartServiceCtrlDispatcher (эта функция кстати не > возвращается пока не завершатся все сервисы, > контроллируемые данным процессом). > Это тоже так, мысли вслух
это тебя великий и могучий МСДН так учит что и как надо делать в ServiceMain
а сами вот как пишут - цитата из lsass.exe (windows 2003 std gold)
.text:01001418 _main proc near ; CODE XREF: mainNoCRTStartup()+33p
.text:01001418
.text:01001418 var_1C = dword ptr -1Ch
.text:01001418 var_4 = dword ptr -4
.text:01001418
.text:01001418 push ebp
.text:01001419 mov ebp, esp
.text:0100141B push ecx
.text:0100141C push esi
.text:0100141D push 1 ; uMode
.text:0100141F call ds:__imp__SetErrorMode@4 ; SetErrorMode(x)
.text:01001425 push offset _LsaTopLevelExceptionHandler@4 ; lpTopLevelExceptionFilter
.text:0100142A call ds:__imp__SetUnhandledExceptionFilter@4 ; SetUnhandledExceptionFilter(x)
.text:01001430 push 1
.text:01001432 push 0
.text:01001434 push 1
.text:01001436 call ds:__imp__RtlSetProcessIsCritical
.text:0100143C add esp, 0Ch
.text:0100143F push 4
.text:01001441 lea eax, [ebp+var_4]
.text:01001444 push eax
.text:01001445 push 5
.text:01001447 push 0FFFFFFFFh
.text:01001449 mov [ebp+var_4], 9
.text:01001450 call ds:__imp__NtSetInformationProcess@16 ; NtSetInformationProcess(x,x,x,x)
.text:01001456 mov esi, eax
.text:01001458 test esi, esi
.text:0100145A jl short loc_10014B7
.text:0100145C call _LsapCheckBootMode@0 ; LsapCheckBootMode()
.text:01001461 mov esi, eax
.text:01001463 test esi, esi
.text:01001465 jl short loc_10014B7
.text:01001467 call _ServiceInit@0 ; ServiceInit()
.text:0100146C mov esi, eax
.text:0100146E test esi, esi
.text:01001470 jl short loc_10014B7
.text:01001472 call _LsapInitLsa@0 ; LsapInitLsa()
.text:01001477 mov esi, eax
.text:01001479 test esi, esi
.text:0100147B jl short loc_10014B7
.text:0100147D call _SamIInitialize@0 ; SamIInitialize()
.text:01001482 mov esi, eax
.text:01001484 test esi, esi
.text:01001486 jl short loc_10014B7
.text:01001488 call _LsapDsInitializePromoteInterface@0 ; LsapDsInitializePromoteInterface()
.text:0100148D mov esi, eax
.text:0100148F test esi, esi
.text:01001491 jl short loc_10014B7
.text:01001493 push 1
.text:01001495 call _LsapAuOpenSam@4 ; LsapAuOpenSam(x)
.text:0100149A mov esi, eax
.text:0100149C test esi, esi
.text:0100149E jl short loc_10014B7
.text:010014A0 call _SampUsingDsData@0 ; SampUsingDsData()
.text:010014A5 xor ecx, ecx
.text:010014A7 test al, al
.text:010014A9 setnz cl
.text:010014AC inc ecx
.text:010014AD mov eax, ecx
.text:010014AF push eax
.text:010014B0 call _LsapDsInitializeDsStateInfo@4 ; LsapDsInitializeDsStateInfo(x)
.text:010014B5 mov esi, eax
.text:010014B7
.text:010014B7 loc_10014B7: ; CODE XREF: _main+42j
.text:010014B7 ; _main+4Dj ...
.text:010014B7 push esi
.text:010014B8 call _LsapNotifyInitializationFinish@4 ; LsapNotifyInitializationFinish(x)
.text:010014BD push esi ; dwExitCode
.text:010014BE call ds:__imp__ExitThread@4 ; ExitThread(x)
.text:010014C4 int 3 ; Trap to Debugger
.text:010014C5
StartServiceCtrlDispatcher вызывается из отдельного треда, созданного внутри samsrv!ServiceInit()
чтобы не ждать пока она действительно не возвращается
он там спокойно не спеша полазит по реестру, инициализирует все свои RPC-шки
а основной поток lsass сразу на старте как хорошо видно выходит по ExitThread
спорим на поллитра?
|
|
|