vinduer - TIB Custom Storage

Indlæg af Hanne Mølgaard Plasc

Problem



Efter ganske lidt googling og nogle tips, der blev givet her, formåede jeg endelig at finde et layout af segmentet FS (bruges af Windows til at gemme TIB data). Af særlig interesse for mig er ArbitraryUserPointer medlemmet leveret i PSDK: [14] [15]


typedef struct \_NT\_TIB {
    struct \_EXCEPTION\_REGISTRATION\_RECORD *ExceptionList;
    PVOID StackBase;
    PVOID StackLimit;
    PVOID SubSystemTib;
    union {
        PVOID FiberData;
        DWORD Version;
    };
    PVOID ArbitraryUserPointer;
    struct \_NT\_TIB *Self;
} NT\_TIB;


Hvor sikkert er det nøjagtigt at bruge denne variabel (under Vista og ovenfor)? og eksisterer den stadig på x64?


Sekundær til det er adgangen til denne variabel. Jeg bruger MSVC, og som sådan jeg
har adgang til \_\_readfsdword & \_\_readgsqword iboende, MSDN af en eller anden grund markerer disse som privilegerede instruktioner: [16]



  Disse egenskaber er kun tilgængelige i kernel-tilstand, og rutinerne er kun tilgængelige som egenskaber.



De er selvfølgelig kun ikke kernel, men hvorfor er de markeret som sådan, bare forkert dokumentation? (mine offline VS 2008-dokumenter har ikke denne bestemmelse).


Endelig er det sikkert at få adgang til ArbitraryUserPointer direkte via en enkelt \_\_readfsdword(0x14) eller foretrækkes det at bruge det via den lineære TIB-adresse? (som stadig kræver en læsning fra FS).

Bedste reference


ArbitraryUserPointer er et internt felt, der ikke er til generel brug. Operativsystemet bruger det internt, og hvis du overskriver det, vil du ødelægge ting. Jeg indrømmer, at det har et meget dårligt navn.

Andre referencer 1


Hvis du stadig står for et svar, har jeg også haft det samme problem og opgivet mit spørgsmål, ligner din:


Tråd-lokal opbevaring i kernel-tilstand?


Jeg har brug for en TLS-ækvivalent i kerne-mode driveren. For at være eksakt, har jeg et dybt funktionsopkaldstræ, som stammer fra et eller andet tidspunkt (førers ekspeditionsrutine), og jeg skal passere kontekstoplysningerne.


I mit særlige tilfælde er fangsten, at jeg ikke har brug for en vedvarende -opbevaring, jeg har bare brug for en trådspecifik pladsholder til noget til et enkelt funktionstelefonsamtale. Derfor besluttede jeg at bruge en vilkårlig indtastning i TLS-arrayet for funktionsopkaldet, og efter at det er gjort - gendan dets oprindelige værdi.


Du får TLS-arrayet med følgende:


DWORD* get\_Tls()
{
    return (DWORD*) (\_\_readfsdword(0x18) + 0xe10);
}


BTW Jeg har ingen anelse om, hvorfor TIB normalt er adgang til ved at læse indholdet af fs:[0x18]. Det er netop peget af fs vælgeren. Men det er sådan, at alle MS 's kode får adgang til det, derfor besluttede jeg at gøre det også.


Dernæst vælger du et vilkårlig TLS indeks, siger 0.


const DWORD g\_dwMyTlsIndex = 0;

void MyTopLevelFunc()
{
    // prolog
    DWORD dwOrgVal = get\_Tls()[g\_dwMyTlsIndex];
    get\_Tls()[g\_dwMyTlsIndex] = dwMyContextValue;

    DoSomething();

    // epilog
    get\_Tls()[g\_dwMyTlsIndex] = dwOrgVal;
}

void DoSomething()
{
    DWORD dwMyContext = get\_Tls()[g\_dwMyTlsIndex];
}