WorkerThread::WorkerThread(TaskScheduler* scheduler) : mScheduler(scheduler) { mTasksEvent = CreateSyncEvent(); static DWORD ThreadID = 0; static char ThreadName[128]; sprintf_s(ThreadName, "worker_thread_%d", ThreadID++); CreateThread(256 * 1024, ThreadName); }
int main(int argc, char **argv) { CUNICODE_STRING us; THREAD *initial_thread = NULL; const char *exename; ParseOptions( argc, argv ); if (optind == argc) { // default to starting smss.exe exename = "\\??\\c:\\winnt\\system32\\smss.exe"; } else { exename = argv[optind]; } // Read debug channels options DebugInit(); // the skas3 patch is deprecated... if (0) InitSkas(); // pass our path so thread tracing can find the client stub InitTt( argv[0] ); if (!pCreateAddressSpace) Die("no way to manage address spaces found\n"); if (!TraceIsEnabled("core")) { // enable backtraces signal(SIGSEGV, SegvHandler); signal(SIGABRT, AbortHandler); } if (RegistryIndex >= 0) { TRACE("created registry: %s\n",registry_list[RegistryIndex].name); Registry = registry_list[RegistryIndex].create(); } else { TRACE("created registry: xml\n"); Registry = REGISTRY_XML::Create(); } // quick sanity test ALLOCATION_BITMAP::Test(); // initialize boottime SYSTEM_TIME_OF_DAY_INFORMATION dummy; GetSystemTimeOfDay( dummy ); FIBER::FibersInit(); InitRoot(); CreateDirectoryObject( (PWSTR) L"\\" ); CreateDirectoryObject( (PWSTR) L"\\??" ); CUNICODE_STRING link_name, link_target; link_name.Set( L"\\DosDevices" ); link_target.Copy( L"\\??" ); CreateSymlink( link_name, link_target ); CreateDirectoryObject( (PWSTR) L"\\Device" ); CreateDirectoryObject( (PWSTR) L"\\Device\\MailSlot" ); CreateDirectoryObject( (PWSTR) L"\\Security" ); //create_directory_object( (PWSTR) L"\\DosDevices" ); CreateDirectoryObject( (PWSTR) L"\\BaseNamedObjects" ); CreateSyncEvent( (PWSTR) L"\\Security\\LSA_AUTHENTICATION_INITIALIZED" ); CreateSyncEvent( (PWSTR) L"\\SeLsaInitEvent" ); InitRandom(); InitPipeDevice(); // XP CreateDirectoryObject( (PWSTR) L"\\KernelObjects" ); CreateSyncEvent( (PWSTR) L"\\KernelObjects\\CritSecOutOfMemoryEvent" ); InitDrives(); InitNtDLL(); CreateKThread(); us.Copy( exename ); int r = CreateInitialProcess( &initial_thread, us ); if (r < STATUS_SUCCESS) Die("create_initial_process() failed (%08x)\n", r); // run the main loop Schedule(); NtGdiFini(); r = initial_thread->Process->ExitStatus; //fprintf(stderr, "process exited (%08x)\n", r); Release( initial_thread ); ShutdownKThread(); DoCleanup(); FreeRoot(); FIBER::FibersFinish(); FreeNtDLL(); return r; }