EXTERN_C BOOL PALAPI CryptImportKey( HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey) { CryptKey* pKey; BLOBHEADER *pBlobHeader; if (hProv == NULL) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (hPubKey != NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } if (dwDataLen < sizeof(BLOBHEADER)) { goto BadKey; } pBlobHeader = (BLOBHEADER*)pbData; if ((pBlobHeader->bVersion != 0x02) || GET_UNALIGNED_VAL16(&pBlobHeader->reserved) != 0x0000) { goto BadKey; } if (!CreateKeyObject(hProv, GET_UNALIGNED_VAL32(&pBlobHeader->aiKeyAlg), &pKey)) { return FALSE; } pKey->SetFlags(dwFlags & CRYPT_EXPORTABLE); if (!pKey->ImportKey(dwFlags, pbData, dwDataLen)) { RELEASE(pKey); return FALSE; } *phKey = (HCRYPTKEY)pKey; return TRUE; BadKey: SetLastError(NTE_BAD_KEY); return FALSE; }
EXTERN_C BOOL PALAPI CryptGenKey( HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey) { CryptKey* pKey; if (hProv == NULL) { SetLastError(ERROR_INVALID_HANDLE); return FALSE; } // substitute the default algorithm if (Algid == AT_SIGNATURE) Algid = CALG_RSA_SIGN; if (!CreateKeyObject(hProv, Algid, &pKey)) { return FALSE; } pKey->SetFlags(dwFlags & CRYPT_EXPORTABLE); if (!pKey->GenKey(dwFlags)) { RELEASE(pKey); return FALSE; } *phKey = (HCRYPTKEY)pKey; return TRUE; }
void AddSelectedItemToWorld( INT32 sGridNo ) { OBJECTTYPE *pObject; INVTYPE *pItem; ITEM_POOL *pItemPool; INT32 iItemIndex; INT8 bVisibility = INVISIBLE; BOOLEAN fFound = FALSE; IPListNode *pIPCurr, *pIPPrev; UINT16 usFlags; //Extract the currently selected item. SpecifyItemToEdit( NULL, -1 ); if( eInfo.uiItemType == TBAR_MODE_ITEM_KEYS ) { CreateKeyObject( &gTempObject, 1, (UINT8)eInfo.sSelItemIndex ); } else { CreateItem( eInfo.pusItemIndex[eInfo.sSelItemIndex], 100, &gTempObject ); } usFlags = 0; switch( gTempObject.usItem ) { case MINE: if ( bVisibility == BURIED ) { usFlags |= WORLD_ITEM_ARMED_BOMB; } break; case MONEY: case SILVER: case GOLD: gTempObject[0]->data.objectStatus = 100; gTempObject[0]->data.money.uiMoneyAmount = 100 + Random( 19901 ); break; case OWNERSHIP: gTempObject[0]->data.owner.ubOwnerProfile = NO_PROFILE; bVisibility = BURIED; break; case SWITCH: if( TriggerAtGridNo( sGridNo ) ) { //Restricted to one action per gridno. return; } bVisibility = BURIED; gTempObject[0]->data.objectStatus = 100; gTempObject[0]->data.misc.ubBombOwner = 1; if( eInfo.sSelItemIndex < 2 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY; else if( eInfo.sSelItemIndex < 4 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_2; else if( eInfo.sSelItemIndex < 6 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_3; else gTempObject[0]->data.misc.bFrequency = (INT8)(FIRST_MAP_PLACED_FREQUENCY + (eInfo.sSelItemIndex-4) / 2); usFlags |= WORLD_ITEM_ARMED_BOMB; break; case ACTION_ITEM: bVisibility = BURIED; gTempObject[0]->data.objectStatus = 100; gTempObject[0]->data.misc.ubBombOwner = 1; gTempObject[0]->data.bTrap = gbDefaultBombTrapLevel; if( eInfo.sSelItemIndex < PRESSURE_ACTION_ID ) { gTempObject[0]->data.misc.bDetonatorType = BOMB_REMOTE; if( eInfo.sSelItemIndex < 2 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY; else if( eInfo.sSelItemIndex < 4 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_2; else if( eInfo.sSelItemIndex < 6 ) gTempObject[0]->data.misc.bFrequency = PANIC_FREQUENCY_3; else gTempObject[0]->data.misc.bFrequency = (INT8)(FIRST_MAP_PLACED_FREQUENCY + (eInfo.sSelItemIndex-4) / 2); } else { gTempObject[0]->data.misc.bDetonatorType = BOMB_PRESSURE; gTempObject[0]->data.misc.bDelay = 0; } ChangeActionItem( &gTempObject, gbActionItemIndex ); gTempObject.fFlags |= OBJECT_ARMED_BOMB; if( gbActionItemIndex == ACTIONITEM_SMPIT ) Add3X3Pit( sGridNo ); else if( gbActionItemIndex == ACTIONITEM_LGPIT ) Add5X5Pit( sGridNo ); usFlags |= WORLD_ITEM_ARMED_BOMB; break; } pObject = InternalAddItemToPool( &sGridNo, &gTempObject, bVisibility, 0, usFlags, 0, -1, &iItemIndex ); if( gTempObject.usItem != OWNERSHIP ) { gWorldItems[ iItemIndex ].ubNonExistChance = (UINT8)(100 - giDefaultExistChance); } else { gWorldItems[ iItemIndex ].ubNonExistChance = 0; } pItem = &( Item[ pObject->usItem ] ); if( pItem->usItemClass == IC_AMMO ) { if (Random( 2 )) { (*pObject)[0]->data.ubShotsLeft = Magazine[ pItem->ubClassIndex ].ubMagSize; } else { (*pObject)[0]->data.ubShotsLeft = (UINT8) Random( Magazine[ pItem->ubClassIndex ].ubMagSize ); } } else { if(gTempObject.usItem != OWNERSHIP)//dnl ch35 110909 (*pObject)[0]->data.objectStatus = (INT8)(70 + Random( 26 )); } if( pItem->usItemClass & IC_GUN ) { if ( pObject->usItem == ROCKET_LAUNCHER ) { (*pObject)[0]->data.gun.ubGunShotsLeft = 1; } else { (*pObject)[0]->data.gun.ubGunShotsLeft = (UINT8)(Random( Weapon[ pObject->usItem ].ubMagSize )); } } if( !GetItemPoolFromGround( sGridNo, &pItemPool ) ) Assert( 0 ); while( pItemPool ) { if( &(gWorldItems[ pItemPool->iItemIndex ].object) == pObject ) { fFound = TRUE; //ShowSelectedItem(); break; } pItemPool = pItemPool->pNext; } Assert( fFound ); gpItemPool = pItemPool; SpecifyItemToEdit( pObject, sGridNo ); //Get access to the itempool. //search for a current node in list containing same mapindex pIPCurr = pIPHead; pIPPrev = NULL; while( pIPCurr ) { pIPPrev = pIPCurr; if( pIPCurr->sGridNo == sGridNo ) { //found one, so we don't need to add it gpCurrItemPoolNode = pIPCurr; return; } pIPCurr = pIPCurr->next; } //there isn't one, so we will add it now. ShowItemCursor( sGridNo ); if( pIPPrev ) { pIPPrev->next = (IPListNode*)MemAlloc( sizeof( IPListNode ) ); Assert( pIPPrev->next ); pIPPrev = pIPPrev->next; pIPPrev->next = NULL; pIPPrev->sGridNo = sGridNo; gpCurrItemPoolNode = pIPPrev; } else { pIPHead = (IPListNode*)MemAlloc( sizeof( IPListNode ) ); Assert( pIPHead ); pIPHead->next = NULL; pIPHead->sGridNo = sGridNo; gpCurrItemPoolNode = pIPHead; } }