Если хотя бы одна из функций rwlock_init, rwlock_destroy, rwlock_wrlock или rwlock_unlock этой структуры не установлена (равна NULL), то провайдер функционирует в режиме без ожидающих блокировок.
При этом ответственность за недопущение параллельного вызова функций, влияющих на глобальное состояние провайдера (CPCAcquireContext, CPCReleaseContext, CPCSetProvParam (PP_USE_HARDWARE_RNG, PP_RANDOM)), приложение берёт на себя.
Кроме того, в этом режиме можно создавать контексты только с флагом CRYPT_NOSERIALIZE, исключающим ожидающие блокировки в данном контексте. (см. CPCAcquireContext).
Функция rwlock_rdlock - опциональна и, в случае её отсуствия, приравнивается к rwlock_wrlock. В случае отсуствия функйии rwlock_rdlock, все операции в рамках одного криптографического контекста будут выполнятся последовательно (однако, операции в разных контекстах будут выполнятся паралельно).
typedef struct CPC_LOCK_FUNCS_ {
CPC_InitRWLock_Callback * rwlock_init;
CPC_DestroyRWLock_Callback * rwlock_destroy;
CPC_RDLockRWLock_Callback * rwlock_rdlock;
CPC_WRLockRWLock_Callback * rwlock_wrlock;
CPC_UnlockRWLock_Callback * rwlock_unlock;
LPVOID lpArg; } CPC_LOCK_FUNCS, *LPCPC_LOCK_FUNCS;
Следует заметить, что одновременный доступ к криптографическим операциям над объеками ключей и хэш-функций приводит к неопределённым криптографческим результатам. Поэтому, при возникновении "соревнований" такого рода, ожидания не происходит. В этих случаях возвращаются ошибки NT_BAD_KEY и NTE_BAD_HASH.