Reputation: 51
I'm trying to communicate with a Windows service via named pipes in a credential provider, but I'm not quite sure where to place the named pipes code within the structure of COM interfaces. I'm using SampleHardwareEventCredentialProvider (from Microsoft) as a testbed, and I created the following code within CSampleCredential.cpp:
// Initializes one credential with the field information passed in.
// Set the value of the SFI_USERNAME field to pwzUsername.
HRESULT CSampleCredential::Initialize(
CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus,
const CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR* rgcpfd,
const FIELD_STATE_PAIR* rgfsp
)
{
HRESULT hr = S_OK;
_cpus = cpus;
// Copy the field descriptors for each field. This is useful if you want to vary the field
// descriptors based on what Usage scenario the credential was created for.
for (DWORD i = 0; SUCCEEDED(hr) && i < ARRAYSIZE(_rgCredProvFieldDescriptors); i++)
{
_rgFieldStatePairs[i] = rgfsp[i];
hr = FieldDescriptorCopy(rgcpfd[i], &_rgCredProvFieldDescriptors[i]);
}
// Initialize named pipe
if (SUCCEEDED(hr)) {
HANDLE pipe = CreateNamedPipe("\\\\.\\pipe\\PipeData", PIPE_ACCESS_INBOUND | PIPE_ACCESS_OUTBOUND, PIPE_WAIT, 1, 1024, 1024, 120 * 1000, NULL);
if (pipe == INVALID_HANDLE_VALUE)
{
cout << "Error: " << GetLastError();
}
char data[1024];
DWORD numRead;
ConnectNamedPipe(pipe, NULL);
ReadFile(pipe, data, 1024, &numRead, NULL);
}
This apparently doesn't work, unless I'm placing it in the wrong spot or not initializing the CP to listen for incoming messages from the Windows service? How would I do this?
Upvotes: 0
Views: 432
Reputation: 173
Create pipe in your windows service. Since you are referring to SampleHardwareEventCredentialProvider sample there is CommandWindow.h and its cpp file.
In that you need to open the created pipe using CreateFile funtion in CCommandWindow::_InitInstance method.
Then you can easily write and read pipe using WriteFile and ReadFile functions.
Feel free to ask if any doubt
Upvotes: 1