1 |
douglas |
446 |
// Stay Connectified |
2 |
|
|
// |
3 |
|
|
// Douglas Thrift |
4 |
|
|
// |
5 |
|
|
// $Id$ |
6 |
|
|
|
7 |
|
|
#include <iostream> |
8 |
|
|
#include <string> |
9 |
|
|
#include <vector> |
10 |
|
|
|
11 |
|
|
#include <windows.h> |
12 |
|
|
#include <shellapi.h> |
13 |
|
|
#include <ras.h> |
14 |
|
|
#include <raserror.h> |
15 |
|
|
|
16 |
|
|
#pragma warning(disable: 4267) |
17 |
|
|
|
18 |
|
|
struct Exception |
19 |
|
|
{ |
20 |
|
|
unsigned long code; |
21 |
|
|
Exception(unsigned long code) : code(code) {} |
22 |
|
|
}; |
23 |
|
|
|
24 |
|
|
template <typename Type> |
25 |
|
|
Type check(Type code) |
26 |
|
|
{ |
27 |
|
|
if (code != 0) |
28 |
|
|
throw Exception(code); |
29 |
|
|
|
30 |
|
|
return code; |
31 |
|
|
} |
32 |
|
|
|
33 |
|
|
int main(int argc, char** argv) |
34 |
|
|
{ |
35 |
|
|
for (int index(1); index != argc; ++index) |
36 |
|
|
std::wcerr << argv[index] << std::endl; |
37 |
|
|
|
38 |
|
|
std::vector<RASENTRYNAME> entries(1); |
39 |
|
|
|
40 |
|
|
entries.front().dwSize = sizeof (RASENTRYNAME); |
41 |
|
|
|
42 |
|
|
unsigned long size(entries.size() * sizeof (RASENTRYNAME)), count; |
43 |
|
|
|
44 |
|
|
loop: try |
45 |
|
|
{ |
46 |
|
|
check(RasEnumEntries(NULL, NULL, &entries.front(), &size, &count)); |
47 |
|
|
} |
48 |
|
|
catch (const Exception& exception) |
49 |
|
|
{ |
50 |
|
|
if (exception.code == ERROR_BUFFER_TOO_SMALL) |
51 |
|
|
{ |
52 |
|
|
entries.resize(entries.size() + size / sizeof (RASENTRYNAME)); |
53 |
|
|
|
54 |
|
|
size = entries.size() * sizeof (RASENTRYNAME); |
55 |
|
|
|
56 |
|
|
goto loop; |
57 |
|
|
} |
58 |
|
|
else |
59 |
|
|
throw exception; |
60 |
|
|
} |
61 |
|
|
|
62 |
|
|
entries.resize(count); |
63 |
|
|
|
64 |
|
|
for (std::vector<RASENTRYNAME>::iterator entry(entries.begin()); entry != entries.end(); ++entry) |
65 |
|
|
std::wcout << entry->szEntryName << std::endl; |
66 |
|
|
|
67 |
|
|
return 0; |
68 |
|
|
} |