Funzione PsCreateSystemThread (wdm.h)
La routine PsCreateSystemThread crea un thread di sistema che esegue in modalità kernel e restituisce un handle per il thread.
Sintassi
NTSTATUS PsCreateSystemThread(
[out] PHANDLE ThreadHandle,
[in] ULONG DesiredAccess,
[in, optional] POBJECT_ATTRIBUTES ObjectAttributes,
[in, optional] HANDLE ProcessHandle,
[out, optional] PCLIENT_ID ClientId,
[in] PKSTART_ROUTINE StartRoutine,
[in, optional] PVOID StartContext
);
Parametri
[out] ThreadHandle
Punta a una variabile che riceverà l'handle. Il driver deve chiudere l'handle con ZwClose una volta che l'handle non è più in uso. Questo handle è un handle kernel per Windows Vista e versioni successive di Windows. Nelle versioni precedenti di Windows, l'handle potrebbe non essere un handle del kernel.
[in] DesiredAccess
Specifica il valore ACCESS_MASK che rappresenta i tipi richiesti di accesso al thread creato.
[in, optional] ObjectAttributes
Punta a una struttura che specifica gli attributi dell'oggetto. OBJ_PERMANENT, OBJ_EXCLUSIVE e OBJ_OPENIF non sono attributi validi per un oggetto thread. In Windows XP e versioni successive di Windows, se il chiamante non è in esecuzione nel contesto del processo di sistema, deve impostare l'attributo OBJ_KERNEL_HANDLE per ObjectAttributes. I driver per Microsoft Windows 2000 e Windows 98/Me devono chiamare solo PsCreateSystemThread dal contesto del processo di sistema. Per Windows Vista e versioni successive di Windows, l'handle sarà un handle kernel.
[in, optional] ProcessHandle
Specifica un handle aperto per il processo nel cui spazio indirizzi deve essere eseguito il thread. Il thread del chiamante deve avere PROCESS_CREATE_THREAD accesso a questo processo. Se questo parametro non viene fornito, il thread verrà creato nel processo di sistema iniziale. Questo valore deve essere NULL per un thread creato dal driver. Usare la macro NtCurrentProcess , definita in Ntddk.h, per specificare il processo corrente.
[out, optional] ClientId
Punta a una struttura che riceve l'identificatore client del nuovo thread. Questo valore deve essere NULL per un thread creato dal driver.
[in] StartRoutine
Punto di ingresso per il thread di sistema appena creato. Questo parametro è un puntatore di funzione a una routine ThreadStart che riceve un singolo argomento, ovvero il valore del parametro StartContext fornito dal chiamante.
[in, optional] StartContext
Fornisce un singolo argomento passato al thread quando inizia l'esecuzione.
Valore restituito
PsCreateSystemThread restituisce STATUS_SUCCESS se il thread è stato creato.
Commenti
I driver che creano thread dedicati al dispositivo chiamano questa routine, quando inizializzano o quando le richieste di I/O iniziano a entrare nelle routine Dispatch di un driver. Ad esempio, un driver potrebbe creare un thread di questo tipo quando riceve una richiesta di controllo del dispositivo asincrona.
PsCreateSystemThread crea un thread in modalità kernel che inizia un thread separato di esecuzione all'interno del sistema. Tale thread di sistema non ha un contesto TEB o in modalità utente ed viene eseguito solo in modalità kernel.
Se l'input ProcessHandle è NULL, il thread creato è associato al processo di sistema. Tale thread continua a essere in esecuzione finché il sistema non viene arrestato o il thread si termina chiamando PsTerminateSystemThread.
Le routine del driver eseguite in un contesto di processo diverso da quello del processo di sistema devono impostare l'attributo OBJ_KERNEL_HANDLE per il parametro ObjectAttributes di PsCreateSystemThread. Ciò limita l'uso dell'handle restituito da PsCreateSystemThread ai processi in esecuzione in modalità kernel. In caso contrario, l'handle del thread può essere accessibile dal processo nel cui contesto è in esecuzione il driver. I driver possono impostare l'attributo OBJ_KERNEL_HANDLE come indicato di seguito.
InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
Per altre informazioni sul parametro StartContext , vedere ThreadStart.
Il thread di sistema appena creato viene eseguito in PASSIVE_LEVEL all'interno di un'area critica con normali API kernel disabilitate.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Libreria | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Regole di conformità DDI | HwStorPortProhibitedDDDIs(storport), IrqlPsPassive(wdm) |