Funzione ExSetResourceOwnerPointerEx (wdm.h)

La routine ExSetResourceOwnerPointerEx trasferisce la proprietà di una risorsa esecutiva dal thread chiamante a un puntatore proprietario, ovvero un indirizzo di sistema che identifica il proprietario della risorsa.

Sintassi

void ExSetResourceOwnerPointerEx(
  [in, out] PERESOURCE Resource,
  [in]      PVOID      OwnerPointer,
  [in]      ULONG      Flags
);

Parametri

[in, out] Resource

Puntatore a una risorsa executive (struttura ERESOURCE opaca) di proprietà del thread chiamante. Il chiamante in precedenza allocato questa struttura e lo inizializzava chiamando la routine ExInitializeResourceLite . Per ulteriori informazioni, vedere la sezione Osservazioni successiva.

[in] OwnerPointer

Valore puntatore che identifica il proprietario della risorsa. Questo valore del parametro è un puntatore a un valore di tipo ERESOURCE_THREAD ma viene eseguito il cast per digitare PVOID. Il chiamante deve impostare i due bit meno significativi di questo valore del puntatore su quelli. Per ulteriori informazioni, vedere la sezione Osservazioni successiva.

[in] Flags

Set di flag che possono modificare l'operazione di questa routine. Impostare questo parametro su zero o sul valore del flag seguente:

  • FLAG_OWNER_POINTER_IS_THREAD
Se Flags = FLAG_OWNER_POINTER_IS_THREAD, OwnerPointer deve puntare a un valore di tipo ERESOURCE_THREAD, ovvero un puntatore a un oggetto thread opaco. Se Flags = 0, OwnerPointer deve puntare a un oggetto di archiviazione nella memoria di sistema che rimane allocata fino al rilascio della risorsa. Per ulteriori informazioni, vedere la sezione Osservazioni successiva.

Valore restituito

nessuno

Osservazioni

Questa routine è disponibile in Windows 7 e versioni successive del sistema operativo Windows.

ExSetResourceOwnerPointerEx consente a un thread, che funge da resource manager, di trasferire la proprietà di una risorsa executive, che il thread ha già acquisito, a un altro thread, che quindi usa la risorsa. La risorsa esecutiva è rappresentata da una struttura ERESOURCE .

Il chiamante deve impostare i due bit meno significativi del valore del parametro OwnerPointer su uno. Il sistema operativo usa questi bit internamente per distinguere un puntatore proprietario impostato da una chiamata exSetResourceOwnerPointerEx da un thread che ha acquisito una risorsa chiamando la routine ExAcquireResourceExclusiveLite o ExAcquireResourceSharedLite.

Il thread che chiama ExSetResourceOwnerPointerEx per trasferire la proprietà di una risorsa deve essere lo stesso thread che in precedenza ha chiamato la routine ExAcquireResourceXxxLite per acquisire la risorsa.

Se il thread resource-manager ha acquisito la risorsa per l'accesso esclusivo (chiamando ExAcquireResourceExclusiveLite), la chiamata ExSetResourceOwnerPointerEx trasferisce la proprietà di accesso esclusivo al thread dell'utente di risorse. Se il thread resource-manager ha acquisito la risorsa per l'accesso condiviso (chiamando ExAcquireResourceSharedLite), exSetResourceOwnerPointerEx trasferisce la proprietà di accesso condiviso al thread di risorse-utente.

Quando il thread di risorse-utente non necessita più della risorsa, la risorsa deve essere rilasciata. In genere, il thread utente di risorse rilascia la risorsa. A tale scopo, deve chiamare la routine ExReleaseResourceForThreadLite . In questa chiamata il valore del parametro ThreadId deve corrispondere al valore del parametro OwnerPointer (inclusi i due bit meno significativi) nella chiamata exSetResourceOwnerPointerEx precedente che ha trasferito la proprietà della risorsa.

Dopo che una chiamata exSetResourceOwnerPointerEx trasferisce la proprietà di una risorsa, l'unica altra routine ERESOURCE che un driver può chiamare per la risorsa specificata è ExReleaseResourceForThreadLite. Un tentativo di chiamare un'altra routine ERESOURCE , ad esempio ExReleaseResourceLite, per questa risorsa è un errore.

ExSetResourceOwnerPointerEx può funzionare in due modalità significativamente diverse. La modalità viene specificata dal parametro Flags . Per selezionare la più versatile delle due modalità, impostare Flag = FLAG_OWNER_POINTER_IS_THREAD. Questo valore Flags informa il sistema operativo che il parametro OwnerPointer è un puntatore all'oggetto thread del thread di resource-manager. Il sistema operativo può, se necessario, usare queste informazioni per aumentare temporaneamente la priorità di questo thread per evitare l'inversione di priorità. Per ottenere il puntatore dell'oggetto thread da usare per il valore OwnerPointer , un driver può chiamare la routine ExGetCurrentResourceThread . Ricordarsi di impostare i due bit meno significativi del valore OwnerPointer su quelli.

Se flag è zero, il comportamento di ExSetResourceOwnerPointerEx è uguale a quello della routine legacy ExSetResourceOwnerPointer , disponibile in Windows 2000 e versioni successive del sistema operativo Windows. Vale a dire, il parametro OwnerPointer punta a un oggetto di archiviazione allocato dal thread resource-manager nella memoria di sistema prima di chiamare ExSetResourceOwnerPointerEx. In questo caso, il tipo di oggetto e il valore non sono rilevanti perché ExSetResourceOwnerPointerEx non tenta di accedere all'oggetto stesso. La routine usa invece semplicemente l'indirizzo di memoria dell'oggetto per identificare il proprietario della risorsa. L'archiviazione per l'oggetto deve iniziare a un limite pari a quattro byte in memoria. Per evitare che due driver usino inavvertitamente lo stesso puntatore proprietario contemporaneamente, il thread resource-manager non deve rilasciare l'archiviazione per l'oggetto finché non viene rilasciata la risorsa.

Per altre informazioni sulla gestione delle risorse esecutive, vedere Introduzione alle routine ERESOURCE.

Requisiti

Requisito Valore
Client minimo supportato Disponibile in Windows 7 e versioni successive del sistema operativo Windows.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDDIs(storport)

Vedi anche

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer