阅读:1484回复:4
keinitializethread的原型
有谁能说一下keinitializethread函数的原型
|
|
沙发#
发布于:2003-02-15 15:03
什么操作系统?
没见到这个函数呢????? |
|
|
板凳#
发布于:2003-02-16 17:54
w2k操作系统,属于ntoskrnl.exe中的函数,带有8个参数
|
|
地板#
发布于:2003-02-16 22:09
严重声明:下面内容是从网上找到的,不保证其正确性!!!
KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First); KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First) /* * FUNCTION: Initialize the microkernel state of the thread */ { PVOID KernelStack; NTSTATUS Status; extern unsigned int init_stack_top; extern unsigned int init_stack; PMEMORY_AREA StackArea; ULONG i; KeInitializeDispatcherHeader(&Thread->DispatcherHeader, InternalThreadType, sizeof(ETHREAD), FALSE); InitializeListHead(&Thread->MutantListHead); if (!First) { KernelStack = NULL; MmLockAddressSpace(MmGetKernelAddressSpace()); Status = MmCreateMemoryArea(NULL, MmGetKernelAddressSpace(), MEMORY_AREA_KERNEL_STACK, &KernelStack, MM_STACK_SIZE, 0, &StackArea, FALSE); MmUnlockAddressSpace(MmGetKernelAddressSpace()); if (!NT_SUCCESS(Status)) { DPRINT1(\"Failed to create thread stack\\n\"); KeBugCheck(0); } for (i = 0; i < (MM_STACK_SIZE / PAGE_SIZE); i++) { PHYSICAL_ADDRESS Page; Status = MmRequestPageMemoryConsumer(MC_NPPOOL, TRUE, &Page); if (!NT_SUCCESS(Status)) { KeBugCheck(0); } Status = MmCreateVirtualMapping(NULL, KernelStack + (i * PAGE_SIZE), PAGE_EXECUTE_READWRITE, Page, TRUE); } Thread->InitialStack = KernelStack + MM_STACK_SIZE; Thread->StackBase = KernelStack + MM_STACK_SIZE; Thread->StackLimit = (ULONG)KernelStack; Thread->KernelStack = KernelStack + MM_STACK_SIZE; } else { Thread->InitialStack = (PVOID)&init_stack_top; Thread->StackBase = (PVOID)&init_stack_top; Thread->StackLimit = (ULONG)&init_stack; Thread->KernelStack = (PVOID)&init_stack_top; } /* * The Native API function will initialize the TEB field later */ Thread->Teb = NULL; Thread->TlsArray = NULL; Thread->DebugActive = 0; Thread->State = THREAD_STATE_INITIALIZED; Thread->Alerted[0] = 0; Thread->Alerted[1] = 0; Thread->Iopl = 0; /* * FIXME: Think how this might work */ Thread->NpxState = 0; Thread->Saturation = 0; Thread->Priority = 0; InitializeListHead(&Thread->ApcState.ApcListHead[0]); InitializeListHead(&Thread->ApcState.ApcListHead[1]); Thread->ApcState.Process = Process; Thread->ApcState.KernelApcInProgress = 0; Thread->ApcState.KernelApcPending = 0; Thread->ApcState.UserApcPending = 0; Thread->ContextSwitches = 0; Thread->WaitStatus = STATUS_SUCCESS; Thread->WaitIrql = 0; Thread->WaitMode = 0; Thread->WaitNext = 0; Thread->WaitBlockList = NULL; Thread->WaitListEntry.Flink = NULL; Thread->WaitListEntry.Blink = NULL; Thread->WaitTime = 0; Thread->BasePriority = 0; Thread->DecrementCount = 0; Thread->PriorityDecrement = 0; Thread->Quantum = 0; memset(Thread->WaitBlock, 0, sizeof(KWAIT_BLOCK)*4); Thread->LegoData = 0; /* * FIXME: Why this? */ Thread->KernelApcDisable = 1; Thread->UserAffinity = Process->Affinity; Thread->SystemAffinityActive = 0; Thread->Queue = NULL; KeInitializeSpinLock(&Thread->ApcQueueLock); memset(&Thread->Timer, 0, sizeof(KTIMER)); Thread->QueueListEntry.Flink = NULL; Thread->QueueListEntry.Blink = NULL; Thread->Affinity = Process->Affinity; Thread->Preempted = 0; Thread->ProcessReadyQueue = 0; Thread->KernelStackResident = 1; Thread->NextProcessor = 0; Thread->CallbackStack = NULL; Thread->Win32Thread = 0; Thread->TrapFrame = NULL; Thread->ApcStatePointer[0] = NULL; Thread->ApcStatePointer[1] = NULL; Thread->EnableStackSwap = 0; Thread->LargeStack = 0; Thread->ResourceIndex = 0; Thread->PreviousMode = KernelMode; Thread->KernelTime = 0; Thread->UserTime = 0; memset(&Thread->SavedApcState, 0, sizeof(KAPC_STATE)); Thread->Alertable = 1; Thread->ApcStateIndex = 0; Thread->ApcQueueable = 0; Thread->AutoAlignment = 0; KeInitializeApc(&Thread->SuspendApc, Thread, 0, PiSuspendThreadKernelRoutine, PiSuspendThreadRundownRoutine, PiSuspendThreadNormalRoutine, KernelMode, NULL); KeInitializeSemaphore(&Thread->SuspendSemaphore, 0, 128); Thread->ThreadListEntry.Flink = NULL; Thread->ThreadListEntry.Blink = NULL; Thread->FreezeCount = 0; Thread->SuspendCount = 0; /* * Initialize ReactOS specific members */ Thread->ProcessThreadListEntry.Flink = NULL; Thread->ProcessThreadListEntry.Blink = NULL; /* * Do x86 specific part */ } NTSTATUS PsInitializeThread(HANDLE ProcessHandle, PETHREAD* ThreadPtr, PHANDLE ThreadHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ThreadAttributes, BOOLEAN First) { .............. KeInitializeThread(&Process->Pcb, &Thread->Tcb, First); Thread->ThreadsProcess = Process; ............... return(STATUS_SUCCESS); } |
|
地下室#
发布于:2003-02-17 08:43
这是reactos的keinitializethread的原型,不是w2k的.
|
|