Bonita Montero
unread,Aug 15, 2023, 3:15:54 AM8/15/23You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
I wanted to check the typed of different Win32 HANDLEs. Although this
is documented I wanted to do that myself. I did that with the functional
programming style I love so much - having code in an initializer_list<>.
#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <functional>
#include <system_error>
using namespace std;
int main( int argc, char **argv )
{
WSADATA wsaData;
(void)WSAStartup( MAKEWORD(2, 2), &wsaData );
using fn_ret_t = pair<char const *, HANDLE>;
using fn_t = function<fn_ret_t ()>;
static fn_t const functions[] =
{
[&]() -> fn_ret_t
{
if( argc < 1 || !argv[0] )
return { nullptr, NULL };
return { "file: ", CreateFileA( argv[0], GENERIC_READ,
FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) };
},
[]() -> fn_ret_t { return { "stdin: ", GetStdHandle( STD_INPUT_HANDLE
) }; },
[]() -> fn_ret_t { return { "TCP-socket: ", (HANDLE)socket( AF_INET,
SOCK_STREAM, IPPROTO_TCP ) }; },
[]() -> fn_ret_t { return { "UDP-socket: ", (HANDLE)socket( AF_INET,
SOCK_DGRAM, IPPROTO_UDP ) }; },
[]() -> fn_ret_t { return { "ICMP-socket: ", (HANDLE)socket( AF_INET,
SOCK_RAW, IPPROTO_ICMP ) }; }
};
using map_t = pair<DWORD, char const*>;
static map_t const mappings[] =
{
{ FILE_TYPE_CHAR, "FILE_TYPE_CHAR" },
{ FILE_TYPE_DISK, "FILE_TYPE_DISK" },
{ FILE_TYPE_PIPE, "FILE_TYPE_PIPE" },
{ FILE_TYPE_REMOTE, "FILE_TYPE_REMOTE" },
{ FILE_TYPE_UNKNOWN, "FILE_TYPE_UNKNOWN" }
};
for( fn_t const &fn : functions )
if( fn_ret_t fr = fn(); fr.first && fr.second )
{
DWORD dwFileType = GetFileType( fr.second );
map_t const *type = find_if( mappings, end( mappings ), [&]( map_t
const &mapEntry ) { return mapEntry.first == dwFileType; } );
if( type == end( mappings ) )
continue;
cout << fr.first << type->second << endl;
}
}