Мне нужно создать указатель на массив указателей, создать несколько ключей с этой структурой WFSPINKEYDETAILEX
CEN / XFS.
Структура в вопросе. Указатель на массив указателей с нулевым символом в конце.
typedef struct _wfs_pin_key_detail_ex
{
LPSTR lpsKeyName;
DWORD dwUse;
BYTE bGeneration;
BYTE bVersion;
BYTE bActivatingDate[4];
BYTE bExpiryDate[4];
BOOL bLoaded;
} WFSPINKEYDETAILEX, * LPWFSPINKEYDETAILEX;
Структура WFSRESULT:
typedef struct _wfs_result
{
REQUESTID RequestID;
HSERVICE hService;
SYSTEMTIME tsTimestamp;
HRESULT hResult;
union {
DWORD dwCommandCode;
DWORD dwEventID;
} u;
LPVOID lpBuffer;
} WFSRESULT, *LPWFSRESULT;
Моя программа:
HRESULT WINAPI WFPGetInfo(HSERVICE hService, DWORD dwCategory, LPVOID lpQueryDetails, DWORD dwTimeOut, HWND hWnd, REQUESTID ReqID) {
WFSPINKEYDETAILEX** ppPinKeyDetail;
WFSRESULT * lpWFSResult;
HRESULT result;
const int PINKEYS = 1;
result = WFMAllocateBuffer(sizeof(WFSRESULT), WFS_MEM_ZEROINIT | WFS_MEM_SHARE, (void**)&lpWFSResult);
if(result != WFS_SUCCESS){
return WFS_ERR_INTERNAL_ERROR;
}
result = WFMAllocateMore(sizeof(WFSPINKEYDETAILEX*) * (PINKEYS+1), lpWFSResult, (void**)&ppPinKeyDetail);
lpWFSResult->hService=hService;
lpWFSResult->RequestID=ReqID;
lpWFSResult->u.dwCommandCode=WFS_INF_PIN_KEY_DETAIL_EX;
lpWFSResult->hResult=WFS_SUCCESS;
if(dwCategory == WFS_INF_PIN_KEY_DETAIL_EX){
for(int i = 0; i < PINKEYS; i++){
result = WFMAllocateMore(sizeof(WFSPINKEYDETAILEX), lpWFSResult, (void**)&ppPinKeyDetail[i]);
}
//This block repeats 5 times with different values...
WFSPINKEYDETAILEX& ppKeyDetail(*ppPinKeyDetail[0]);
ppKeyDetail.lpsKeyName = (LPSTR) "DEVICE_KBPK";
ppKeyDetail.dwUse = WFS_PIN_USESECURECONSTRUCT;
ppKeyDetail.bLoaded = TRUE;
ppKeyDetail.bVersion = 0xFF;
ppKeyDetail.bGeneration = 0xFF;
ppKeyDetail.bActivatingDate[0] = 0xFF;
ppKeyDetail.bActivatingDate[1] = 0xFF;
ppKeyDetail.bActivatingDate[2] = 0xFF;
ppKeyDetail.bActivatingDate[3] = 0xFF;
ppKeyDetail.bExpiryDate[0] = 0xFF;
ppKeyDetail.bExpiryDate[1] = 0xFF;
ppKeyDetail.bExpiryDate[2] = 0xFF;
ppKeyDetail.bExpiryDate[3] = 0xFF;
//This block repeats 5 times with different values...
//...
lpWFSResult->lpBuffer = ppPinKeyDetail;
}
}
Последняя программа компилируется, проблема в том, что когда я запускаю приложение в качестве поставщика услуг, оно игнорирует этот массив ключей.
Журнал приложения с использованием поставщика услуг готов:
Key: DEVICE_KBPK.
dwUses: 1024.
bLoaded: 1.
bGeneration: FF.
bVersion: FF.
bActivatingDate: FF FF FF FF.
bExpiryDate: FF FF FF FF.
Generation unpack: .
Version unpack: .
ActivatingDate unpack: .
Expiry Date unpack: .
Key added to vector.
Когда я пользуюсь услугами своего провайдера (из этой темы), это приводит к краху JAVA.
Основное приложение сделано в Java и через JNA потребляет библиотеки DLL
Задача ещё не решена.
Других решений пока нет …