Статическое TLS.Никак неврублюсь как оно работает.

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 15 янв 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    В прошлой теме мне никто так внятно и неответил.Да ещё и было утверждение что локальный статический ТЛС юзают одни и тежи механизмы,я тут маленько поэксперементировал.И понял что механизмы они используют абсолютно разные.
    Код (Text):
    1. #include <windows.h>
    2. #include <conio.h>
    3. #include <Winternl.h>
    4. __declspec( thread ) int tls_i=1;
    5. __declspec( thread ) char tls_char[25]="Hello World";
    6. typedef PTEB (NTAPI *_NtCurrentTeb)();
    7. DWORD WINAPI Thr(LPVOID lParam)
    8. {
    9.     for(int i=0;i<tls_i;i++)
    10.     {
    11.         MessageBoxA(0,tls_char,"",MB_OK);
    12.     }
    13.     printf("data site VA: %d\n",(DWORD)tls_char);
    14.     DWORD selfBase=(DWORD)GetModuleHandle(NULL);
    15.     DWORD toNT=( (IMAGE_DOS_HEADER*)selfBase)->e_lfanew;
    16.     IMAGE_NT_HEADERS *ntH=(IMAGE_NT_HEADERS*)(selfBase+toNT);
    17.     IMAGE_TLS_DIRECTORY *itd=(IMAGE_TLS_DIRECTORY*)(ntH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress+selfBase);
    18.     printf("itd->StartAddressOfRawData: %d\nitd->EndAddressOfRawData: %d\n",itd->StartAddressOfRawData,itd->EndAddressOfRawData);
    19.     HMODULE lib=LoadLibraryA("ntdll.dll");
    20.     _NtCurrentTeb NtCurrentTeb=(_NtCurrentTeb)GetProcAddress(lib,"NtCurrentTeb");
    21.     TEB *teb=NtCurrentTeb();
    22.     printf("TlsSlots:\n");
    23.     for(DWORD i=0;i<63;i++)
    24.     {
    25.         if(teb->TlsSlots[i]!=NULL){printf("Index :%d:%s\n",i,(char*)teb->TlsSlots[i]);}
    26.     }
    27.     printf("TlsGetValue:\n");
    28.     for(DWORD i=0;i<1023;i++)
    29.     {
    30.         if(TlsGetValue(i)!=NULL)
    31.         {
    32.             printf("Index: %d:%s\n",i,(char*)TlsGetValue(i));
    33.         }
    34.     }
    35.     DWORD cell=TlsAlloc();
    36.     TlsSetValue(cell,tls_char);
    37.     printf("%s",(char*)teb->TlsSlots[cell]);
    38.     return(0);
    39. }
    40. int _tmain(int argc, _TCHAR* argv[])
    41. {
    42.     CreateThread(0,0,&Thr,0,0,0);
    43.     getch();
    44.     return 0;
    45. }
    результат меня вконец запутал
    Почему tls_char находится не в блоке StartAddressOfRawData-EndAddressOfRawData ???