2012-02-13 9 views
1

꽤 많은 검색 결과와 몇 가지 힌트가 here으로 제공된 후 세그먼트 (컴퓨터에서 TIB 데이터를 저장하는 데 사용)의 find a layout으로 마침내 관리했습니다. 나에게 특별한 관심의 PSDK에서 제공하는 ArbitraryUserPointer 멤버는 다음과 같습니다TIB 맞춤 저장소

정확히 (위 Vista에서와)이 변수를 사용하는 것입니다 얼마나 안전
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; 

? x64에도 여전히 존재합니까?

보조 변수는이 변수에 대한 액세스입니다.

가이 내장 함수는 커널 모드에서만 사용할 수 있으며, 루틴 : 어떤 이유로 MSDN 다음과 같은 특권 명령을 표시하지만, 나는 MSVC를 사용하고, 그리고 같은 나는 __readfsdword & __readgsqword 내장 함수에 액세스 할 수 intrinsics로만 사용할 수 있습니다.

그들은 하지 커널에만 물론,하지만 왜는 단지 잘못된 문서로 표시됩니다? (내 오프라인 VS 2008 문서에는이 절이 없습니다).

마지막으로 __readfsdword(0x14)을 통해 ArbitraryUserPointer에 직접 액세스하거나 선형 TIB 주소를 통해 액세스하는 것이 안전합니까? (여전히 FS에서 읽어야합니다).

답변

3

ArbitraryUserPointer은 일반적으로 사용되지 않는 내부 입력란입니다. 운영 체제는이를 내부적으로 사용하며, 덮어 쓰면 내용이 손상됩니다. 나는 그것이 매우 가난한 이름을 가지고 있다고 인정한다.

경우
+2

흠이 응용 프로그램 관리로 이전 MSVC 기사는 아래로 표시했다 특히 이후, 실망 이잖아 말한다. 어떤 회원이 애플리케이션 관리 대 운영체제를 관리하는지에 관한 문서가 있습니까?기본적으로 TLS 기반이 아닌 포인터를 숨길 곳을 찾고 있습니다. – Necrolis

+0

TLS에서 응용 프로그램의 무료 사용을 고려할 수있는 유일한 방법입니다. ('ArbitraryUserPointer'와 같은 것이 있다면, 어떻게 두 DLL이 제어권을 협상합니까?) –

+0

SEH/스택 보안 토큰을 하이 잭킹 할 수 없습니까? (나는 이것을 사용하기 위해 SEH/보안 토큰을 가지지 않을 것이다). 그 외의 다른 스레드 데이터에 대해서는 단 하나의 __declspec (thread)를 사용합니다 ... – Necrolis

0

당신이 대답을 아직도, 나는 너무 같은 문제를 가지고 있었고, 당신과 비슷한 내 질문에, 게시 한 : Thread-local storage in kernel mode?

내가는 커널에서 TLS-상응하는 필요를 모드 드라이버. 정확히 말하자면, 나는 어떤 지점 (예를 들어 드라이버의 디스패치 루틴)에서 시작된 깊은 함수 호출 트리를 가지고 있으며 컨텍스트 정보를 전달해야합니다.

내 구체적인 경우 catch는 영구적 인 저장소가 필요하지 않습니다. 단 하나의 최상위 함수 호출을위한 스레드 별 자리 표시 자만 있으면됩니다. 따라서 함수 호출을 위해 TLS 배열에서 임의의 항목을 사용하기로 결정하고 완료 후에 원래 값을 복원합니다.

은 다음으로 TLS 배열을 얻을 :

DWORD* get_Tls() 
{ 
    return (DWORD*) (__readfsdword(0x18) + 0xe10); 
} 

가 BTW 나는 TIB는 일반적으로 fs:[0x18]의 내용을 읽어 액세스 할 이유를 모르겠어요. 선택자 fs이 가리키고 있습니다. 그러나 이것이 모든 MS의 코드가 액세스하는 방법입니다. 따라서이 작업도 수행하기로 결정했습니다.

다음, 당신은 임의의 TLS 인덱스를 선택, 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]; 
} 
+0

내가이 질문을하기 전에 이것을 사용했다. 문제는 TLS에 의존하지 않고 영구 저장 장치가 필요하다는 것이다. 그래서 지금은 더미'__declspec (thread)'vars를 사용하고있다. – Necrolis