Поставщик учетных данных и именованные каналы

Я пытаюсь связаться со службой Windows через именованные каналы в поставщике учетных данных, но я не совсем уверен, где разместить код именованных каналов в структуре COM-интерфейсов. Я использую SampleHardwareEventCredentialProvider (от Microsoft) в качестве испытательного стенда и создал следующий код в 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);
}

Это, по-видимому, не работает, если только я не помещаю его в неправильное место или не инициализирую CP для прослушивания входящих сообщений от службы Windows? Как бы я это сделал?


person sunny    schedule 21.06.2016    source источник


Ответы (1)


Создайте канал в службе Windows. Поскольку вы имеете в виду пример SampleHardwareEventCredentialProvider, существует CommandWindow.h и его файл cpp.

В нем вам нужно открыть созданный канал с помощью функции CreateFile в методе CCommandWindow::_InitInstance.

После этого вы сможете легко писать и читать конвейер, используя функции WriteFile и ReadFile.

Не стесняйтесь спрашивать, если у вас есть сомнения.

person Aman Jain    schedule 27.04.2017