sub import_api_ex {
my ( $lib, $sig ) = @_;
my $key = join "_", map { uc } ( $lib, $sig );
$api{$key} = Win32::API->new( $lib, $sig )
unless exists $api{$key};
return $api{$key};
}
sub define_struct {
my ( $name, @params ) = @_;
Win32::API::Struct->typedef( $name, @params );
}
####
DWORD QueryUsersOnEncryptedFile(
LPCWSTR lpFileName, // file name
PENCRYPTION_CERTIFICATE_HASH_LIST *pUsers // hash list
);
####
BEGIN {
define_struct(
'EFS_HASH_BLOB',
qw/
DWORD cbData;
LPBYTE pbData;
/
);
define_struct(
'ENCRYPTION_CERTIFICATE_HASH',
qw/
DWORD cbTotalLength;
void* pUserSid;
LPEFS_HASH_BLOB pHash;
LPWSTR lpDisplayInformation;
/
);
define_struct(
'ENCRYPTION_CERTIFICATE_HASH_LIST',
qw/
DWORD nCert_Hash;
LPENCRYPTION_CERTIFICATE_HASH* pUsers;
/
);
}
####
sub query_users {
my ( $self, $filename ) = @_;
my $func = import_api_ex( 'advapi32', 'DWORD QueryUsersOnEncryptedFile(LPCWSTR lpFileName, LPENCRYPTION_CERTIFICATE_HASH_LIST* pUsers)'
);
die "Could not import API QueryUsersOnEncryptedFile: $!"
unless defined $func;
}
####
Win32::API::parse_prototype: WARNING unknown parameter type 'LPENCRYPTION_CERTIFICATE_HASH_LIST*' at C:/Perl/site/lib/Wi
n32/API.pm line 248, line 164.