use strict; use Win32API::File qw(CreateFile DeviceIoControl :FILE_SHARE_ :Misc); use Data::Dumper; sub IOCTL_NDIS_QUERY_GLOBAL_STATS () { 0x17 << 16 | 2 }; sub OID_802_3_PERMANENT_ADDRESS () { 0x01010101 }; sub OID_802_3_CURRENT_ADDRESS () { 0x01010102 }; sub OID_PNP_SET_POWER () { 0xFD010101 }; sub OID_PNP_QUERY_POWER () { 0xFD010102 }; # This routine graciously provided by PerlMonk almut # http://www.perlmonks.org/?node_id=580097 # http://www.perlmonks.org/?node_id=639099 sub NDIS_Query { my ($handle, $oid) = @_; my $nBytes = 0; my $buf = "\0"x10; my $oidp = pack("L", $oid); DeviceIoControl($handle, IOCTL_NDIS_QUERY_GLOBAL_STATS(), $oidp, length($oidp), $buf, length($buf), $nBytes, [] ); if($nBytes > 0) { #return join "-", unpack("(a2)*", unpack("H*", $buf) ); return(unpack("b*", $buf)); } return(); } # Get nic info via wmic (not available on all versions of windows)... my @devs = split(/^\s*\cM\n/m, `wmic nicconfig list /format:value`); shift(@devs); # Remove initial blank line # Iterate through each device... foreach my $d (@devs) { $d =~ s/\cM//g; # Grrrr, rotten windows my %node = split(/[=\n]/, $d); # Hashify information print "\n$node{Description} ($node{ServiceName}) \n"; # Make device to do the ioctl on... my $fname = '//./' . $node{SettingID}; #my $fname = '//Device/NPF_' . $node{SettingID}; my $fd = CreateFile($fname, 0, FILE_SHARE_READ(), [], OPEN_EXISTING(), 0, []); print "\t$fname "; if(!$fd) { print "$!\n"; next; } else { print "\n" }; # print info... print "\tCurrent Power :", NDIS_Query($fd, OID_PNP_QUERY_POWER()), ":\n"; print "\tPermanent MAC :", NDIS_Query($fd, OID_802_3_PERMANENT_ADDRESS()), ":\n"; print "\tCurrent MAC :", NDIS_Query($fd, OID_802_3_CURRENT_ADDRESS()), ":\n"; #print Dumper(\%node); }