cmv has asked for the wisdom of the Perl Monks concerning the following question:
I'm just learning all about the many cool OID ioctl's that can be used to communicate with device drivers - OS independently (as I understand). The latest one I came across is OID_PNP_QUERY_POWER, which directs the device driver to: "Tell me what power state you are currently at".
Windows XP identifies that the responses from using OID_PNP_QUERY_POWER should be one of:
Since I was interested in trying to get this information out of the collection of NIC devices on my laptop (along with other stuff), I hacked up a quick script and made it available below.0x0 NdisDeviceStateUnspecified (PM not supported) 0x1 NdisDeviceStateD0 (fully powered) 0x2 NdisDeviceStateD1 (less-than-fully powered) 0x3 NdisDeviceStateD2 (more-less-than-fully powered) 0x4 NdisDeviceStateD3 (really-almost-not-powered-at-all)
My problem is that although the OID_802_3* ioctl's are working, the OMP_PNP_QUERY_POWER one does not.
Any thoughts on what I am doing wrong?
Thanks
-Craig
UPDATE:...thats *PNP* not *PMP (sorry...)
UPDATE: I'm attaching the code here instead of in my scratchpad, by request:
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_ADD +RESS()), ":\n"; print "\tCurrent MAC :", NDIS_Query($fd, OID_802_3_CURRENT_ADDRESS +()), ":\n"; #print Dumper(\%node); }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: OID Power Status Query
by NetWallah (Canon) on Oct 02, 2007 at 20:29 UTC | |
by cmv (Chaplain) on Oct 03, 2007 at 20:05 UTC |