Указатель на массив указателей структуры

Мне нужно создать указатель на массив указателей, создать несколько ключей с этой структурой 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

0 ответов

Другие вопросы по тегам