Subversion Repositories userdetect2

Rev

Rev 69 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
68 daniel-mar 1
#ifndef _UD2_UTILS_H_
2
#define _UD2_UTILS_H_
3
 
4
#include <windows.h>
5
#include <assert.h>
6
 
69 daniel-mar 7
#include "ud2_api.h"
8
 
68 daniel-mar 9
// #define USE_OLE32
10
 
11
#ifdef USE_OLE32
12
#pragma comment(linker, "-lOle32")
13
#define __GUID(x) _StringToGUID(L ## x)
14
const GUID _StringToGUID(LPCWSTR lpcstrGUID) {
15
        GUID guid;
16
        assert(SUCCEEDED(CLSIDFromString(lpcstrGUID, &guid)));
17
        return guid;
18
}
19
#else
20
#define __GUID(x) _StringToGUID(x)
21
const bool StringToGUID(const char* szGUID, GUID* g) {
22
        // Check if string is a valid GUID
23
        if (strlen(szGUID) != 38) return false;
24
        for (int i=0; i<strlen(szGUID); ++i) {
25
                char g = szGUID[i];
26
 
27
                if (i == 0) {
28
                        if (g != '{') return false;
29
                } else if (i == 37) {
30
                        if (g != '}') return false;
31
                } else if ((i == 9) || (i == 14) || (i == 19) || (i == 24)) {
32
                        if (g != '-') return false;
33
                } else {
34
                        if (!((g >= '0') && (g <= '9')) && !((g >= 'A') && (g <= 'F')) && !((g >= 'a') && (g <= 'f'))) {
35
                                return false;
36
                        }
37
                }
38
        }
39
 
40
        char* pEnd;
41
    g->Data1 = strtol(szGUID+1,&pEnd,16);
42
    g->Data2 = strtol(szGUID+10,&pEnd,16);
43
    g->Data3 = strtol(szGUID+15,&pEnd,16);
44
        char b[3]; b[2] = 0;   
45
        memcpy(&b[0], szGUID+20, 2*sizeof(b[0])); g->Data4[0] = strtol(&b[0], &pEnd, 16);
46
        memcpy(&b[0], szGUID+22, 2*sizeof(b[0])); g->Data4[1] = strtol(&b[0], &pEnd, 16);
70 daniel-mar 47
        for (int i=0; i<6; ++i) {
68 daniel-mar 48
                memcpy(&b[0], szGUID+25+i*2, 2*sizeof(b[0])); g->Data4[2+i] = strtol(&b[0], &pEnd, 16);
49
        }
50
        return true;
51
}
52
const GUID _StringToGUID(const char* szGUID) {
53
        GUID g;
54
        assert(StringToGUID(szGUID, &g));
55
        return g;
56
}
57
#endif
58
 
69 daniel-mar 59
BOOL UD2_IsMultilineW(LPCWSTR lpSrc) {
60
        return wcschr(lpSrc, UD2_MULTIPLE_ITEMS_DELIMITER) != NULL;
61
        // return wcspbrk(lpSrc, L"\r\n") != NULL;
68 daniel-mar 62
}
63
 
69 daniel-mar 64
UD2_STATUS UD2_WriteStrW(LPWSTR lpDest, DWORD cchDestSize, LPCWSTR lpSrc) {
65
        if (wcslen(lpSrc) > cchDestSize-1) return UD2_STATUS_ERROR_BUFFER_TOO_SMALL;
66
        wcscpy(lpDest, lpSrc);
67
        if (wcslen(lpSrc) == 0) return UD2_STATUS_NOTAVAIL_UNSPECIFIED;
68
        if (UD2_IsMultilineW(lpSrc)) return UD2_STATUS_OK_MULTILINE;
69
        return UD2_STATUS_OK_SINGLELINE;
68 daniel-mar 70
}
71
 
72
#endif