在js-ctypes中调用SCardListReaders时出错 [英] Error while calling SCardListReaders in js-ctypes

查看:170
本文介绍了在js-ctypes中调用SCardListReaders时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用js-ctypes来为Firefox插件调用winscard函数。 SCardEstablishContext正常工作,但在调用SCardListReaders时会返回以下错误:
SCARD_ERROR_INVALID_HANDLE 0x80100006



这是我的代码:



  var {Cu} = require(chrome); 
var {ctypes} = Cu.import(resource://gre/modules/ctypes.jsm,null);
const NULL = ctypes.voidptr_t(0);
var is64bit = ctypes.voidptr_t.size == 4?假:真;
var TYPES = {
ABI:is64bit? ctypes.default_abi:ctypes.winapi_abi,
CALLBACK_ABI:is64bit? ctypes.default_abi:ctypes.stdcall_cabi,
DWORD:ctypes.uint32_t,
LPCVOID:ctypes.voidptr_t,
LPSCARDCONTEXT:ctypes.voidptr_t,
LPSTR:ctypes.jschar.ptr,
LPCSTR:ctypes.char.ptr

var CONST = {
SCARD_SCOPE_USER:0,
SCARD_SCOPE_SYSTEM:2,
SCARD_S_SUCCESS:0
};
var cardLib = ctypes.open(Winscard);
变种SCardEstablishContext = cardLib.declare( SCardEstablishContext,TYPES.ABI,TYPES.DWORD,TYPES.DWORD,TYPES.LPCVOID,TYPES.LPCVOID,TYPES.LPSCARDCONTEXT);
var ContextHandle = TYPES.LPSCARDCONTEXT();
var ret = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM,null,null,ContextHandle.address());
var SCardListReadersA = cardLib.declare(SCardListReadersA,TYPES.ABI,TYPES.DWORD,TYPES.LPSCARDCONTEXT,TYPES.LPCSTR,TYPES.LPSTR,TYPES.DWORD);
var reader_count = TYPES.DWORD();
var reader_names = ctypes.jschar.ptr();
var ret = SCardListReadersA(ContextHandle.address(),null,reader_names,reader_count);
cardLib.close();


解决方案

文档显示这个函数是在这样的一个方法有两种方法可以做到这一点。

方法1



发送 null 缓冲区,取回一个计数,自己分配一个缓冲区到这个计数,发送这个分配的缓冲区来填充。在这里看到: GitHubGIST :: Noitidart / _ff-addon-snippet-WinAPI-listCardReadersManAlloc.js

  Cu.import('resource://gre/modules/ctypes.jsm'); 

var is64bit = ctypes.voidptr_t.size == 4?假:真;
var ifdef_UNICODE = true;

var TYPES = {
ABI:is64bit? ctypes.default_abi:ctypes.winapi_abi,
CALLBACK_ABI:is64bit? ctypes.default_abi:ctypes.stdcall_cabi,

CHAR:ctypes.char,
DWORD:ctypes.uint32_t,
LONG:ctypes.long,
LPCVOID:ctypes。 voidptr_t,
ULONG_PTR:is64bit? ctypes.uint64_t:ctypes.unsigned_long,
WCHAR:ctypes.jschar
};

//高级类型 - 基于简单类型
TYPES.LPSTR = TYPES.CHAR.ptr;
TYPES.LPCSTR = TYPES.CHAR.ptr;
TYPES.LPDWORD = TYPES.DWORD.ptr;
TYPES.LPCWSTR = TYPES.WCHAR.ptr;
TYPES.LPWSTR = TYPES.WCHAR.ptr;
TYPES.SCARDCONTEXT = TYPES.ULONG_PTR;

//高级高级类型 - 基于高级类型
TYPES.LPCTSTR = ifdef_UNICODE? TYPES.LPCWSTR:TYPES.LPCSTR;
TYPES.LPTSTR = ifdef_UNICODE? TYPES.LPWSTR:TYPES.LPSTR;
TYPES.PSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;
TYPES.LPSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;
$ b var CONST = {
SCARD_SCACHE_USER:0,
SCARD_S_SUCCESS:0
};

var cardLib = ctypes.open('Winscard');
变种SCardEstablishContext = cardLib.declare( SCardEstablishContext,TYPES.ABI,TYPES.DWORD,TYPES.DWORD,TYPES.LPCVOID,TYPES.LPCVOID,TYPES.LPSCARDCONTEXT);
变种SCardListReaders = cardLib.declare(ifdef_UNICODESCardListReadersW:SCardListReadersA,TYPES.ABI,TYPES.LONG,TYPES.SCARDCONTEXT,TYPES.LPCTSTR,TYPES.LPTSTR,TYPES.LPDWORD);
var SCardFreeMemory = cardLib.declare('SCardFreeMemory',TYPES.ABI,TYPES.LONG,TYPES.SCARDCONTEXT,TYPES.LPCVOID);
var SCardReleaseContext = cardLib.declare('SCardReleaseContext',TYPES.ABI,TYPES.LONG,TYPES.SCARDCONTEXT);

//类型,常量和函数声明完成,现在让我们使用它
try {
var hSC = TYPES.SCARDCONTEXT();
var rez_SCEC = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM,null,null,hSC.address());
if(rez_SCEC.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('failed to establish context!error code was:'+ rez_SCEC +'in other terms是:0x'+ rez_SCEC.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29的.aspx#smart_card_return_values');
抛出新错误('建立上下文失败!');
}

try {
var reader_count = TYPES.DWORD();
var rez_SCLR = SCardListReaders(hSC,null,null,reader_count.address());
console.log('rez_SCLR:',rez_SCLR,rez_SCLR.toString());
if(rez_SCLR.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('读者列表失败!错误代码为:'+ rez_SCLR +'它是:0x'+ rez_SCLR.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85 %29.aspx#smart_card_return_values');
抛出新的错误('未能获取读者列表!');


console.log('parseInt(reader_count.value):',parseInt(reader_count.value));

var reader_names = TYPES.LPTSTR.targetType.array(parseInt(reader_count.value))();
console.log('reader_names.toString()',reader_names.toString());
console.log('reader_names.address()。toString()',reader_names.address()。toString());

var rez_SCLR = SCardListReaders(hSC,null,reader_names,reader_count.address());
console.log('rez_SCLR:',rez_SCLR,rez_SCLR.toString());
if(rez_SCLR.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('读取者列表失败!错误代码是:'+ rez_SCLR +'它是:0x'+ rez_SCLR.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85 %29.aspx#smart_card_return_values');
抛出新的错误('未能获取读者列表!');
}
console.error('reader_names.toString()',reader_names.toString());
console.error('reader_names.address()。toString()',reader_names.address()。toString());

} finally {
var rez_release = SCardReleaseContext(hSC);
console.log('rez_release:',rez_release,rez_release.toString());
if(rez_release.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('failed to release context!error code was:'+ rez_release +'in other terms是:0x'+ rez_release.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29的.aspx#smart_card_return_values');
抛出新错误('未能释放上下文!');
}
}

} finally {
cardLib.close();
console.log('cardLib closed');

$ / code>



方法2



发送一个特殊的常量和一个0缓冲区,它会自动为你分配一个缓冲区,并将你的0缓冲区指向的地址改变为这个自动分配的缓冲区,然后你必须释放这个缓冲区。这可以在这里看到: GitHubGIST :: Noitidart / _ff-addon-snippet-WinAPI-listCardReadersAutoAlloc.js

  Cu.import('resource://gre/modules/ctypes.jsm'); 

var is64bit = ctypes.voidptr_t.size == 4?假:真;
var ifdef_UNICODE = true;

var TYPES = {
ABI:is64bit? ctypes.default_abi:ctypes.winapi_abi,
CALLBACK_ABI:is64bit? ctypes.default_abi:ctypes.stdcall_cabi,

CHAR:ctypes.char,
DWORD:ctypes.uint32_t,
LONG:ctypes.long,
LPCVOID:ctypes。 voidptr_t,
ULONG_PTR:is64bit? ctypes.uint64_t:ctypes.unsigned_long,
WCHAR:ctypes.jschar
};

//高级类型 - 基于简单类型
TYPES.LPSTR = TYPES.CHAR.ptr;
TYPES.LPCSTR = TYPES.CHAR.ptr;
TYPES.LPDWORD = TYPES.DWORD.ptr;
TYPES.LPCWSTR = TYPES.WCHAR.ptr;
TYPES.LPWSTR = TYPES.WCHAR.ptr;
TYPES.SCARDCONTEXT = TYPES.ULONG_PTR;

//高级高级类型 - 基于高级类型
TYPES.LPCTSTR = ifdef_UNICODE? TYPES.LPCWSTR:TYPES.LPCSTR;
TYPES.LPTSTR = ifdef_UNICODE? TYPES.LPWSTR:TYPES.LPSTR;
TYPES.PSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;
TYPES.LPSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;
$ b var CONST = {
SCARD_SCACHE_USER:0,
SCARD_S_SUCCESS:0
};

var cardLib = ctypes.open('Winscard');
变种SCardEstablishContext = cardLib.declare( SCardEstablishContext,TYPES.ABI,TYPES.DWORD,TYPES.DWORD,TYPES.LPCVOID,TYPES.LPCVOID,TYPES.LPSCARDCONTEXT);
变种SCardListReaders = cardLib.declare(ifdef_UNICODESCardListReadersW:SCardListReadersA,TYPES.ABI,TYPES.LONG,TYPES.SCARDCONTEXT,TYPES.LPCTSTR,TYPES.LPTSTR.ptr,TYPES.LPDWORD);
var SCardFreeMemory = cardLib.declare('SCardFreeMemory',TYPES.ABI,TYPES.LONG,TYPES.SCARDCONTEXT,TYPES.LPCVOID);
var SCardReleaseContext = cardLib.declare('SCardReleaseContext',TYPES.ABI,TYPES.LONG,TYPES.SCARDCONTEXT);

//类型,常量和函数声明完成,现在让我们使用它
try {
var hSC = TYPES.SCARDCONTEXT();
var rez_SCEC = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM,null,null,hSC.address());
if(rez_SCEC.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('failed to establish context!error code was:'+ rez_SCEC +'in other terms是:0x'+ rez_SCEC.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29的.aspx#smart_card_return_values');
抛出新错误('建立上下文失败!');
}

尝试{
var reader_count = TYPES.DWORD('0xffffffff');
var reader_names = TYPES.LPTSTR();

console.log('reader_names.toString()',reader_names.toString());
console.log('reader_names.address()。toString()',reader_names.address()。toString());

var rez_SCLR = SCardListReaders(hSC,null,reader_names.address(),reader_count.address());
console.log('rez_SCLR:',rez_SCLR,rez_SCLR.toString());
if(rez_SCLR.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('读者列表失败!错误代码为:'+ rez_SCLR +'它是:0x'+ rez_SCLR.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85 %29.aspx#smart_card_return_values');
抛出新的错误('未能获取读者列表!');


console.error('reader_names.toString()',reader_names.toString());
console.error('reader_names.address()。toString()',reader_names.address()。toString());

var rez_free = SCardFreeMemory(hSC,reader_names);
console.log('rez_free:',rez_free,rez_free.toString());
if(rez_free.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('未能释放列出读卡器的多字符串!错误代码是:'+ rez_free +',换句话说就是:0x'+ rez_free.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738 %28V = vs.85%29.aspx#smart_card_return_values');
抛出新错误('未能释放列出读卡器的多字符串!');
}
} finally {
var rez_release = SCardReleaseContext(hSC);
console.log('rez_release:',rez_release,rez_release.toString());
if(rez_release.toString()!= CONST.SCARD_S_SUCCESS.toString()){
console.error('failed to release context!error code was:'+ rez_release +'in other terms是:0x'+ rez_release.toString(16)+'你可以在这里查找这个错误值:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29的.aspx#smart_card_return_values');
抛出新错误('未能释放上下文!');
}
}

} finally {
cardLib.close();
console.log('cardLib closed');
}


I am calling winscard functions using js-ctypes for a Firefox addon. SCardEstablishContext works properly but when calling SCardListReaders returns the following error: SCARD_ERROR_INVALID_HANDLE 0x80100006

Here is my code:

var {Cu} = require("chrome");
var{ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", null);
const NULL = ctypes.voidptr_t(0);
var is64bit = ctypes.voidptr_t.size == 4 ? false : true;
var TYPES = {
    ABI: is64bit ? ctypes.default_abi : ctypes.winapi_abi,
    CALLBACK_ABI: is64bit ? ctypes.default_abi : ctypes.stdcall_cabi,
    DWORD: ctypes.uint32_t,
    LPCVOID: ctypes.voidptr_t,
    LPSCARDCONTEXT: ctypes.voidptr_t,
    LPSTR: ctypes.jschar.ptr,
    LPCSTR: ctypes.char.ptr
}
var CONST = {
    SCARD_SCOPE_USER: 0,
    SCARD_SCOPE_SYSTEM: 2,
    SCARD_S_SUCCESS: 0
};
var cardLib = ctypes.open("Winscard");
var SCardEstablishContext = cardLib.declare("SCardEstablishContext", TYPES.ABI, TYPES.DWORD, TYPES.DWORD, TYPES.LPCVOID, TYPES.LPCVOID, TYPES.LPSCARDCONTEXT);
var ContextHandle = TYPES.LPSCARDCONTEXT();
var ret = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM, null, null, ContextHandle.address());
var SCardListReadersA = cardLib.declare("SCardListReadersA", TYPES.ABI, TYPES.DWORD, TYPES.LPSCARDCONTEXT, TYPES.LPCSTR, TYPES.LPSTR, TYPES.DWORD );
var reader_count = TYPES.DWORD();
var reader_names = ctypes.jschar.ptr();
var ret = SCardListReadersA(ContextHandle.address(), null, reader_names,reader_count );
cardLib.close();

解决方案

The documentation shows that this function was created in such a way that there are two ways to do this.

Method 1

Send null buffer, get back a count, allocate a buffer yourself to that count, send this allocted buffer to get populated. That is seen here: GitHubGIST :: Noitidart / _ff-addon-snippet-WinAPI-listCardReadersManAlloc.js

Cu.import('resource://gre/modules/ctypes.jsm');

var is64bit = ctypes.voidptr_t.size == 4 ? false : true;
var ifdef_UNICODE = true;

var TYPES = {
    ABI: is64bit ? ctypes.default_abi : ctypes.winapi_abi,
    CALLBACK_ABI: is64bit ? ctypes.default_abi : ctypes.stdcall_cabi,

    CHAR: ctypes.char,
    DWORD: ctypes.uint32_t,
    LONG: ctypes.long,
    LPCVOID: ctypes.voidptr_t,
    ULONG_PTR: is64bit ? ctypes.uint64_t : ctypes.unsigned_long,
    WCHAR: ctypes.jschar
};

// advanced types - based on simple types
TYPES.LPSTR = TYPES.CHAR.ptr;
TYPES.LPCSTR = TYPES.CHAR.ptr;
TYPES.LPDWORD = TYPES.DWORD.ptr;
TYPES.LPCWSTR = TYPES.WCHAR.ptr;
TYPES.LPWSTR = TYPES.WCHAR.ptr;
TYPES.SCARDCONTEXT = TYPES.ULONG_PTR;

// advanced advanced types - based on advanced types
TYPES.LPCTSTR = ifdef_UNICODE ? TYPES.LPCWSTR : TYPES.LPCSTR;
TYPES.LPTSTR = ifdef_UNICODE ? TYPES.LPWSTR : TYPES.LPSTR;
TYPES.PSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;
TYPES.LPSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;

var CONST = {
    SCARD_AUTOALLOCATE: TYPES.DWORD('0xffffffff'),
    SCARD_SCOPE_SYSTEM: 2,
    SCARD_SCOPE_USER: 0,
    SCARD_S_SUCCESS: 0
};

var cardLib = ctypes.open('Winscard');
var SCardEstablishContext = cardLib.declare('SCardEstablishContext', TYPES.ABI, TYPES.DWORD, TYPES.DWORD, TYPES.LPCVOID, TYPES.LPCVOID, TYPES.LPSCARDCONTEXT);
var SCardListReaders = cardLib.declare(ifdef_UNICODE ? 'SCardListReadersW' : 'SCardListReadersA', TYPES.ABI, TYPES.LONG, TYPES.SCARDCONTEXT, TYPES.LPCTSTR, TYPES.LPTSTR, TYPES.LPDWORD);
var SCardFreeMemory = cardLib.declare('SCardFreeMemory', TYPES.ABI, TYPES.LONG, TYPES.SCARDCONTEXT, TYPES.LPCVOID);
var SCardReleaseContext = cardLib.declare('SCardReleaseContext', TYPES.ABI, TYPES.LONG, TYPES.SCARDCONTEXT);

// types, consts, and functions declarations complete, now lets use it
try {
    var hSC = TYPES.SCARDCONTEXT();
    var rez_SCEC = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM, null, null, hSC.address());
    if (rez_SCEC.toString() != CONST.SCARD_S_SUCCESS.toString()) {
        console.error('failed to establish context! error code was: ' + rez_SCEC + ' in other terms it is: 0x' + rez_SCEC.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
        throw new Error('failed to establish context!');
    }

    try {
        var reader_count = TYPES.DWORD();               
        var rez_SCLR = SCardListReaders(hSC, null, null, reader_count.address());
        console.log('rez_SCLR:', rez_SCLR, rez_SCLR.toString());
        if (rez_SCLR.toString() != CONST.SCARD_S_SUCCESS.toString()) {
            console.error('failed to get list of readers! error code was: ' + rez_SCLR + ' in other terms it is: 0x' + rez_SCLR.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
            throw new Error('failed to get list of readers!');
        }

        console.log('parseInt(reader_count.value):', parseInt(reader_count.value));

        var reader_names = TYPES.LPTSTR.targetType.array(parseInt(reader_count.value))();
        console.log('reader_names.toString()', reader_names.toString());
        console.log('reader_names.address().toString()', reader_names.address().toString());

        var rez_SCLR = SCardListReaders(hSC, null, reader_names, reader_count.address());
        console.log('rez_SCLR:', rez_SCLR, rez_SCLR.toString());
        if (rez_SCLR.toString() != CONST.SCARD_S_SUCCESS.toString()) {
            console.error('failed to get list of readers! error code was: ' + rez_SCLR + ' in other terms it is: 0x' + rez_SCLR.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
            throw new Error('failed to get list of readers!');
        }
        console.error('reader_names.toString()', reader_names.toString());
        console.error('reader_names.address().toString()', reader_names.address().toString());

    } finally {
        var rez_release = SCardReleaseContext(hSC);
        console.log('rez_release:', rez_release, rez_release.toString());
        if (rez_release.toString() != CONST.SCARD_S_SUCCESS.toString()) {
            console.error('failed to release context! error code was: ' + rez_release + ' in other terms it is: 0x' + rez_release.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
            throw new Error('failed to release context!');
        }
    }

} finally {
    cardLib.close();
    console.log('cardLib closed');
}

Method 2

Send a special constant and a 0 buffer, and it will auto-allocate a buffer for you and change the address your 0 buffer points to - to this auto-allocated buffer, which you then have to free. This is seen here: GitHubGIST :: Noitidart / _ff-addon-snippet-WinAPI-listCardReadersAutoAlloc.js

Cu.import('resource://gre/modules/ctypes.jsm');

var is64bit = ctypes.voidptr_t.size == 4 ? false : true;
var ifdef_UNICODE = true;

var TYPES = {
    ABI: is64bit ? ctypes.default_abi : ctypes.winapi_abi,
    CALLBACK_ABI: is64bit ? ctypes.default_abi : ctypes.stdcall_cabi,

    CHAR: ctypes.char,
    DWORD: ctypes.uint32_t,
    LONG: ctypes.long,
    LPCVOID: ctypes.voidptr_t,
    ULONG_PTR: is64bit ? ctypes.uint64_t : ctypes.unsigned_long,
    WCHAR: ctypes.jschar
};

// advanced types - based on simple types
TYPES.LPSTR = TYPES.CHAR.ptr;
TYPES.LPCSTR = TYPES.CHAR.ptr;
TYPES.LPDWORD = TYPES.DWORD.ptr;
TYPES.LPCWSTR = TYPES.WCHAR.ptr;
TYPES.LPWSTR = TYPES.WCHAR.ptr;
TYPES.SCARDCONTEXT = TYPES.ULONG_PTR;

// advanced advanced types - based on advanced types
TYPES.LPCTSTR = ifdef_UNICODE ? TYPES.LPCWSTR : TYPES.LPCSTR;
TYPES.LPTSTR = ifdef_UNICODE ? TYPES.LPWSTR : TYPES.LPSTR;
TYPES.PSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;
TYPES.LPSCARDCONTEXT = TYPES.SCARDCONTEXT.ptr;

var CONST = {
    SCARD_AUTOALLOCATE: TYPES.DWORD('0xffffffff'),
    SCARD_SCOPE_SYSTEM: 2,
    SCARD_SCOPE_USER: 0,
    SCARD_S_SUCCESS: 0
};

var cardLib = ctypes.open('Winscard');
var SCardEstablishContext = cardLib.declare('SCardEstablishContext', TYPES.ABI, TYPES.DWORD, TYPES.DWORD, TYPES.LPCVOID, TYPES.LPCVOID, TYPES.LPSCARDCONTEXT);
var SCardListReaders = cardLib.declare(ifdef_UNICODE ? 'SCardListReadersW' : 'SCardListReadersA', TYPES.ABI, TYPES.LONG, TYPES.SCARDCONTEXT, TYPES.LPCTSTR, TYPES.LPTSTR.ptr, TYPES.LPDWORD);
var SCardFreeMemory = cardLib.declare('SCardFreeMemory', TYPES.ABI, TYPES.LONG, TYPES.SCARDCONTEXT, TYPES.LPCVOID);
var SCardReleaseContext = cardLib.declare('SCardReleaseContext', TYPES.ABI, TYPES.LONG, TYPES.SCARDCONTEXT);

// types, consts, and functions declarations complete, now lets use it
try {
    var hSC = TYPES.SCARDCONTEXT();
    var rez_SCEC = SCardEstablishContext(CONST.SCARD_SCOPE_SYSTEM, null, null, hSC.address());
    if (rez_SCEC.toString() != CONST.SCARD_S_SUCCESS.toString()) {
        console.error('failed to establish context! error code was: ' + rez_SCEC + ' in other terms it is: 0x' + rez_SCEC.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
        throw new Error('failed to establish context!');
    }

    try {
        var reader_count = TYPES.DWORD('0xffffffff');
        var reader_names = TYPES.LPTSTR();

        console.log('reader_names.toString()', reader_names.toString());
        console.log('reader_names.address().toString()', reader_names.address().toString());

        var rez_SCLR = SCardListReaders(hSC, null, reader_names.address(), reader_count.address());
        console.log('rez_SCLR:', rez_SCLR, rez_SCLR.toString());
        if (rez_SCLR.toString() != CONST.SCARD_S_SUCCESS.toString()) {
            console.error('failed to get list of readers! error code was: ' + rez_SCLR + ' in other terms it is: 0x' + rez_SCLR.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
            throw new Error('failed to get list of readers!');
        }

        console.error('reader_names.toString()', reader_names.toString());
        console.error('reader_names.address().toString()', reader_names.address().toString());

        var rez_free = SCardFreeMemory(hSC, reader_names);
        console.log('rez_free:', rez_free, rez_free.toString());
        if (rez_free.toString() != CONST.SCARD_S_SUCCESS.toString()) {
            console.error('failed to free the multi-string that lists the card readers! error code was: ' + rez_free + ' in other terms it is: 0x' + rez_free.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
            throw new Error('failed to free the multi-string that lists the card readers!');
        }
    } finally {
        var rez_release = SCardReleaseContext(hSC);
        console.log('rez_release:', rez_release, rez_release.toString());
        if (rez_release.toString() != CONST.SCARD_S_SUCCESS.toString()) {
            console.error('failed to release context! error code was: ' + rez_release + ' in other terms it is: 0x' + rez_release.toString(16) + ' you can look up this error value here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738%28v=vs.85%29.aspx#smart_card_return_values');
            throw new Error('failed to release context!');
        }
    }

} finally {
    cardLib.close();
    console.log('cardLib closed');
}

这篇关于在js-ctypes中调用SCardListReaders时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆