2016-06-21 5 views
0

Я пытаюсь связаться с сервисом 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? Как мне это сделать?

ответ

1

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

Для этого вам нужно открыть созданный канал, используя CreateFile funtion в методе CCommandWindow :: _ InitInstance.

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

Не стесняйтесь спрашивать, имеются ли какие-либо сомнения