-
-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathhelper.c
More file actions
165 lines (149 loc) · 3.55 KB
/
helper.c
File metadata and controls
165 lines (149 loc) · 3.55 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#pragma once
#include "helper.h"
ASN1module_t hASN1Module = NULL;
ASN1encoding_t ASN1enc = NULL;
ASN1decoding_t ASN1dec = NULL;
static const ASN1GenericFun_t encdecfreefntab[] = { NULL };
static const ASN1uint32_t sizetab[] = { 0 };
BOOL asn1_init()
{
BOOL status = FALSE;
int ret;
if (hASN1Module = ASN1_CreateModule(ASN1_THIS_VERSION, ASN1_BER_RULE_DER, ASN1FLAGS_NOASSERT, 1, encdecfreefntab, encdecfreefntab, (const ASN1FreeFun_t*)encdecfreefntab, sizetab, 'iwik'))
{
ret = ASN1_CreateEncoder(hASN1Module, &ASN1enc, NULL, 0, NULL);
if (ASN1_FAILED(ret))
{
PRINT_ERROR(L"ASN1_CreateEncoder: %i\n", ret);
ASN1enc = NULL;
}
else
{
ret = ASN1_CreateDecoder(hASN1Module, &ASN1dec, NULL, 0, NULL);
if (ASN1_FAILED(ret))
{
PRINT_ERROR(L"ASN1_CreateDecoder: %i\n", ret);
ASN1dec = NULL;
}
}
}
else PRINT_ERROR(L"ASN1_CreateModule\n");
status = hASN1Module && ASN1enc && ASN1dec;
if (!status)
asn1_term();
return status;
}
void asn1_term()
{
if (ASN1dec)
{
ASN1_CloseDecoder(ASN1dec);
ASN1dec = NULL;
}
if (ASN1enc)
{
ASN1_CloseEncoder(ASN1enc);
ASN1enc = NULL;
}
if (hASN1Module)
{
ASN1_CloseModule(hASN1Module);
hASN1Module = NULL;
}
}
BOOL DotVal2Eoid(__in const ASN1char_t* dotOID, __out OssEncodedOID* encodedOID)
{
BOOL status = FALSE;
if (ASN1enc && dotOID && encodedOID)
{
encodedOID->length = 0;
encodedOID->value = NULL;
status = ASN1BERDotVal2Eoid(ASN1enc, dotOID, encodedOID);
}
return status;
}
void freeEnc(void* pBuf)
{
if (ASN1enc && pBuf)
ASN1_FreeEncoded(ASN1enc, pBuf);
}
void print_msg(PCWCHAR format, ...)
{
va_list args;
va_start(args, format);
vwprintf(format, args);
fflush(stdout);
va_end(args);
}
BOOL string_copy(LPWSTR* dst, LPCWSTR src)
{
BOOL status = FALSE;
size_t size;
if (src && dst && (size = wcslen(src)))
{
size = (size + 1) * sizeof(wchar_t);
if (*dst = (LPWSTR)LocalAlloc(LPTR, size))
{
RtlCopyMemory(*dst, src, size);
status = TRUE;
}
}
return status;
}
BOOL getSidDomainFromName(PCWSTR pName, PSID* pSid, PWSTR* pDomain, PSID_NAME_USE pSidNameUse, LPCWSTR system)
{
BOOL result = FALSE;
SID_NAME_USE sidNameUse;
PSID_NAME_USE peUse = pSidNameUse ? pSidNameUse : &sidNameUse;
DWORD cbSid = 0, cchReferencedDomainName = 0;
if (!LookupAccountName(system, pName, NULL, &cbSid, NULL, &cchReferencedDomainName, peUse) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
{
if (*pSid = (PSID)LocalAlloc(LPTR, cbSid * sizeof(wchar_t)))
{
if (*pDomain = (PWSTR)LocalAlloc(LPTR, cchReferencedDomainName * sizeof(wchar_t)))
{
result = LookupAccountName(system, pName, *pSid, &cbSid, *pDomain, &cchReferencedDomainName, peUse);
if (!result)
*pDomain = (PWSTR)LocalFree(*pDomain);
}
if (!result)
*pSid = (PSID)LocalFree(*pSid);
}
}
return result;
}
void displaySID(IN PSID pSid)
{
LPSTR stringSid;
if (ConvertSidToStringSidA(pSid, &stringSid))
{
printf("%s", stringSid);
LocalFree(stringSid);
}
}
PCWCHAR WPRINTF_TYPES[] =
{
L"%02x", // WPRINTF_HEX_SHORT
L"%02x ", // WPRINTF_HEX_SPACE
L"0x%02x, ", // WPRINTF_HEX_C
L"\\x%02x", // WPRINTF_HEX_PYTHON
};
void wprintf_hex(LPCVOID lpData, DWORD cbData, DWORD flags)
{
DWORD i, sep = flags >> 16;
PCWCHAR pType = WPRINTF_TYPES[flags & 0x0000000f];
if ((flags & 0x0000000f) == 2)
PRINT_NORMAL(L"\nBYTE data[] = {\n\t");
for (i = 0; i < cbData; i++)
{
PRINT_NORMAL(pType, ((LPCBYTE)lpData)[i]);
if (sep && !((i + 1) % sep))
{
PRINT_NORMAL(L"\n");
if ((flags & 0x0000000f) == 2)
PRINT_NORMAL(L"\t");
}
}
if ((flags & 0x0000000f) == 2)
PRINT_NORMAL(L"\n};\n");
}