File: tsk_error_win32.cpp

package info (click to toggle)
sleuthkit 4.12.1%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 18,608 kB
  • sloc: ansic: 143,795; cpp: 52,225; java: 37,892; xml: 2,416; python: 1,076; perl: 874; makefile: 439; sh: 184
file content (73 lines) | stat: -rw-r--r-- 1,243 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
 * The Sleuth Kit
 *
 * Brian Carrier [carrier <at> sleuthkit [dot] org]
 * Copyright (c) 2010-2011 Brian Carrier.  All Rights reserved
 *
 * This software is distributed under the Common Public License 1.0
 */


#include "tsk_base_i.h"

#ifdef TSK_WIN32


#include <windows.h>

namespace tsk {

	class GetTlsIndex {
	public:
		GetTlsIndex() {
			tlsIndex = TlsAlloc();
		}
		
		~GetTlsIndex() {
			TlsFree(tlsIndex);
		}
    
		DWORD GetIndex() {
			return tlsIndex;
		}
	private:
		static DWORD tlsIndex;
	};

	DWORD GetTlsIndex::tlsIndex;
	static GetTlsIndex getTlsIndex;
}

/*
 * There's no destructor model in Win32 as with pthreads.
 * A DLLMain could do the job, but we're not a DLL.
 */
extern "C"
void *tsk_error_win32_get_per_thread_(unsigned struct_size) {

	DWORD index = tsk::getTlsIndex.GetIndex();
	void *ptr = TlsGetValue( index );
	if (ptr == 0) {
		ptr = malloc(struct_size);
		memset(ptr, 0, struct_size);
		TlsSetValue(index, ptr);
	}
	return ptr;
}

/*
 * Threads must call this on exit to avoid a leak.
*/
extern "C"
void tsk_error_win32_thread_cleanup() {

	DWORD index = tsk::getTlsIndex.GetIndex();
	void *ptr = TlsGetValue(index);
	if (ptr != 0) {
		free(ptr);
		TlsSetValue(index, 0);
	}
}


#endif /*TSK_WIN32*/