2
0
mirror of https://github.com/tenrok/Rfid-Credential-Provider.git synced 2026-06-17 19:30:32 +03:00

Z-2 USB Reader

This commit is contained in:
2019-11-29 15:55:40 +03:00
parent 0d171c5d02
commit 0e158db171
44 changed files with 768 additions and 8763 deletions
@@ -12,15 +12,13 @@
#include "Logger.h"
extern HINSTANCE hInstance;
typedef int (WINAPI * PFRUNGATEFRAMEWORKPWDRESET) (HWND, PWSTR, PWSTR, PWSTR);
typedef int (WINAPI* PFRUNGATEFRAMEWORKPWDRESET) (HWND, PWSTR, PWSTR, PWSTR);
RfidCredential::RfidCredential():
RfidCredential::RfidCredential() :
_cRef(1),
_pCredProvCredentialEvents(NULL)
{
DllAddRef();
ZeroMemory(_rgCredProvFieldDescriptors, sizeof(_rgCredProvFieldDescriptors));
ZeroMemory(_rgFieldStatePairs, sizeof(_rgFieldStatePairs));
ZeroMemory(_rgFieldStrings, sizeof(_rgFieldStrings));
@@ -33,7 +31,6 @@ RfidCredential::~RfidCredential()
CoTaskMemFree(_rgFieldStrings[i]);
CoTaskMemFree(_rgCredProvFieldDescriptors[i].pszLabel);
}
DllRelease();
}
@@ -46,24 +43,20 @@ HRESULT RfidCredential::Initialize(
PWSTR pwzUsername,
PWSTR pwzPassword,
PWSTR pwzDomain
)
)
{
UNREFERENCED_PARAMETER(pwzPassword);
HRESULT hr = S_OK;
for (DWORD i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(_rgCredProvFieldDescriptors); i++)
{
_rgFieldStatePairs[i] = rgfsp[i];
hr = FieldDescriptorCopy(rgcpfd[i], &_rgCredProvFieldDescriptors[i]);
}
username = pwzUsername;
password = pwzPassword;
domain = pwzDomain;
LPWSTR loginString;
if(username && domain){
if (username && domain) {
loginString = new wchar_t[10 + wcslen(username) + wcslen(password)];
wsprintf(loginString, L"Login as %s\\%s", domain, username);
}
@@ -73,35 +66,37 @@ HRESULT RfidCredential::Initialize(
}
if (SUCCEEDED(hr))
{
if(!username){
if (!username)
{
hr = SHStrDupW(L"Swipe your registered RFID credential now.", &_rgFieldStrings[SFI_DETAILS]);
}else{
}
else
{
hr = SHStrDupW(loginString, &_rgFieldStrings[SFI_DETAILS]);
}
}
if (SUCCEEDED(hr))
{
if(!username){
if (!username)
{
hr = SHStrDupW(L"Swipe your token", &_rgFieldStrings[SFI_MINIDETAILS]);
}else{
}
else
{
hr = SHStrDupW(loginString, &_rgFieldStrings[SFI_MINIDETAILS]);
}
}
return S_OK;
}
HRESULT RfidCredential::Advise(
ICredentialProviderCredentialEvents* pcpce
)
HRESULT RfidCredential::Advise(ICredentialProviderCredentialEvents* pcpce)
{
if (_pCredProvCredentialEvents != NULL)
if (_pCredProvCredentialEvents != nullptr)
{
_pCredProvCredentialEvents->Release();
}
_pCredProvCredentialEvents = pcpce;
_pCredProvCredentialEvents->AddRef();
return S_OK;
}
@@ -111,28 +106,29 @@ HRESULT RfidCredential::UnAdvise()
{
_pCredProvCredentialEvents->Release();
}
_pCredProvCredentialEvents = NULL;
_pCredProvCredentialEvents = nullptr;
return S_OK;
}
HRESULT RfidCredential::SetSelected(BOOL* pbAutoLogon)
HRESULT RfidCredential::SetSelected(BOOL* pbAutoLogon)
{
if(username && password && domain && !this->lastLoginFailed){
if (username && password && domain && !this->lastLoginFailed)
{
*pbAutoLogon = TRUE;
}else{
}
else
{
*pbAutoLogon = FALSE;
if(this->lastLoginFailed){
if(_pCredProvCredentialEvents != NULL){
if (this->lastLoginFailed)
{
if (_pCredProvCredentialEvents != nullptr)
{
_pCredProvCredentialEvents->SetFieldString(this, SFI_MINIDETAILS, L"Login credentials were invalid.");
_pCredProvCredentialEvents->SetFieldString(this, SFI_DETAILS, L"Login details were invalid. You will need to login with a different credential to update them.");
_pCredProvCredentialEvents->SetFieldBitmap(this, SFI_TILEIMAGE, LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(104)));
}
}
}
return S_OK;
}
@@ -142,37 +138,26 @@ HRESULT RfidCredential::SetDeselected()
return hr;
}
HRESULT RfidCredential::GetFieldState(
DWORD dwFieldID,
CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs,
CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis
)
HRESULT RfidCredential::GetFieldState(DWORD dwFieldID, CREDENTIAL_PROVIDER_FIELD_STATE* pcpfs, CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pcpfis)
{
HRESULT hr;
if ((dwFieldID < ARRAYSIZE(_rgFieldStatePairs)) && pcpfs && pcpfis)
{
*pcpfs = _rgFieldStatePairs[dwFieldID].cpfs;
*pcpfis = _rgFieldStatePairs[dwFieldID].cpfis;
hr = S_OK;
}
else
{
hr = E_INVALIDARG;
}
return hr;
}
HRESULT RfidCredential::GetStringValue(
DWORD dwFieldID,
PWSTR* ppwsz
)
HRESULT RfidCredential::GetStringValue(DWORD dwFieldID, PWSTR* ppwsz)
{
HRESULT hr;
if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) && ppwsz)
if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) && ppwsz)
{
hr = SHStrDupW(_rgFieldStrings[dwFieldID], ppwsz);
}
@@ -180,27 +165,23 @@ HRESULT RfidCredential::GetStringValue(
{
hr = E_INVALIDARG;
}
return hr;
}
HRESULT RfidCredential::GetBitmapValue(
DWORD dwFieldID,
HBITMAP* phbmp
)
HRESULT RfidCredential::GetBitmapValue(DWORD dwFieldID, HBITMAP* phbmp)
{
HRESULT hr;
if ((SFI_TILEIMAGE == dwFieldID) && phbmp)
{
HBITMAP hbmp;
if(username && password && domain && !this->lastLoginFailed){
if (username && password && domain && !this->lastLoginFailed)
{
hbmp = LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(102));
}else{
}
else
{
hbmp = LoadBitmap(HINST_THISDLL, MAKEINTRESOURCE(101));
}
if (hbmp != NULL)
{
hr = S_OK;
@@ -215,106 +196,73 @@ HRESULT RfidCredential::GetBitmapValue(
{
hr = E_INVALIDARG;
}
return hr;
}
HRESULT RfidCredential::GetSubmitButtonValue(
DWORD dwFieldID,
DWORD* pdwAdjacentTo
)
HRESULT RfidCredential::GetSubmitButtonValue(DWORD dwFieldID, DWORD* pdwAdjacentTo)
{
return E_INVALIDARG;
}
HRESULT RfidCredential::SetStringValue(
DWORD dwFieldID,
PCWSTR pwz
)
HRESULT RfidCredential::SetStringValue(DWORD dwFieldID, PCWSTR pwz)
{
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(pwz);
return E_NOTIMPL;
}
HRESULT RfidCredential::GetCheckboxValue(
DWORD dwFieldID,
BOOL* pbChecked,
PWSTR* ppwszLabel
)
HRESULT RfidCredential::GetCheckboxValue(DWORD dwFieldID, BOOL* pbChecked, PWSTR* ppwszLabel)
{
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(pbChecked);
UNREFERENCED_PARAMETER(ppwszLabel);
return E_NOTIMPL;
}
HRESULT RfidCredential::GetComboBoxValueCount(
DWORD dwFieldID,
DWORD* pcItems,
DWORD* pdwSelectedItem
)
HRESULT RfidCredential::GetComboBoxValueCount(DWORD dwFieldID, DWORD* pcItems, DWORD* pdwSelectedItem)
{
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(pcItems);
UNREFERENCED_PARAMETER(pdwSelectedItem);
return E_NOTIMPL;
}
HRESULT RfidCredential::GetComboBoxValueAt(
DWORD dwFieldID,
DWORD dwItem,
PWSTR* ppwszItem
)
HRESULT RfidCredential::GetComboBoxValueAt(DWORD dwFieldID, DWORD dwItem, PWSTR* ppwszItem)
{
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(dwItem);
UNREFERENCED_PARAMETER(ppwszItem);
return E_NOTIMPL;
}
HRESULT RfidCredential::SetCheckboxValue(
DWORD dwFieldID,
BOOL bChecked
)
HRESULT RfidCredential::SetCheckboxValue(DWORD dwFieldID, BOOL bChecked)
{
UNREFERENCED_PARAMETER(dwFieldID);
UNREFERENCED_PARAMETER(bChecked);
return E_NOTIMPL;
}
HRESULT RfidCredential::SetComboBoxSelectedValue(
DWORD dwFieldId,
DWORD dwSelectedItem
)
HRESULT RfidCredential::SetComboBoxSelectedValue(DWORD dwFieldId, DWORD dwSelectedItem)
{
UNREFERENCED_PARAMETER(dwFieldId);
UNREFERENCED_PARAMETER(dwSelectedItem);
return E_NOTIMPL;
}
HRESULT RfidCredential::CommandLinkClicked(DWORD dwFieldID)
{
UNREFERENCED_PARAMETER(dwFieldID);
return E_NOTIMPL;
}
HRESULT RfidCredential::GetSerialization(
CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE* pcpgsr,
CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs,
PWSTR* ppwzOptionalStatusText,
CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* pcpcs,
PWSTR* ppwzOptionalStatusText,
CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon
)
)
{
UNREFERENCED_PARAMETER(ppwzOptionalStatusText);
UNREFERENCED_PARAMETER(pcpsiOptionalStatusIcon);
@@ -322,53 +270,47 @@ HRESULT RfidCredential::GetSerialization(
ZeroMemory(&kil, sizeof(kil));
HRESULT hr;
this->lastLoginFailed = true;
WCHAR wsz[MAX_COMPUTERNAME_LENGTH+1];
DWORD cch = ARRAYSIZE(wsz);
GetComputerNameW(wsz, &cch);
//WCHAR wsz[MAX_COMPUTERNAME_LENGTH+1];
//DWORD cch = ARRAYSIZE(wsz);
//GetComputerNameW(wsz, &cch);
hr = UnicodeStringInitWithString(domain, &kil.LogonDomainName);
hr = UnicodeStringInitWithString(username, &kil.UserName);
hr = UnicodeStringInitWithString(password, &kil.Password);
if (SUCCEEDED(hr))
{
kil.MessageType = lockType;
hr = KerbInteractiveLogonPack(kil, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
if (SUCCEEDED(hr))
{
ULONG ulAuthPackage;
hr = RetrieveNegotiateAuthPackage(&ulAuthPackage);
if (SUCCEEDED(hr))
{
kil.MessageType = lockType;
hr = KerbInteractiveLogonPack(kil, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
if (SUCCEEDED(hr))
{
ULONG ulAuthPackage;
hr = RetrieveNegotiateAuthPackage(&ulAuthPackage);
if (SUCCEEDED(hr))
{
pcpcs->ulAuthenticationPackage = ulAuthPackage;
pcpcs->clsidCredentialProvider = CLSID_RfidProvider;
*pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
}
}
pcpcs->ulAuthenticationPackage = ulAuthPackage;
pcpcs->clsidCredentialProvider = CLSID_RfidProvider;
*pcpgsr = CPGSR_RETURN_CREDENTIAL_FINISHED;
}
else
{
DWORD dwErr = GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
}
}
}
else
{
DWORD dwErr = GetLastError();
hr = HRESULT_FROM_WIN32(dwErr);
}
return hr;
}
HRESULT RfidCredential::ReportResult(
NTSTATUS ntsStatus,
NTSTATUS ntsStatus,
NTSTATUS ntsSubstatus,
PWSTR* ppwszOptionalStatusText,
PWSTR* ppwszOptionalStatusText,
CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon
)
)
{
UNREFERENCED_PARAMETER(ntsSubstatus);
UNREFERENCED_PARAMETER(ppwszOptionalStatusText);
UNREFERENCED_PARAMETER(pcpsiOptionalStatusIcon);
return E_NOTIMPL;
}