You cannot create a Named Pipe in BHO. But you can create it in your brokerage process and connect to the pipe from BHO. I am the author of this comment, and I checked the code in the brokerage part of my IE addon.
Code snippets. Creating pipes in autostart exe (Delphi)
function CreateAppContainerSecurityDescriptor(var SD: PSECURITY_DESCRIPTOR): boolean; const SDDL_REVISION_1 = 1; var pSD: PSECURITY_DESCRIPTOR; ConvertStringSecurityDescriptorToSecurityDescriptor: TConvertStringSecurityDescriptorToSecurityDescriptorW; begin @ConvertStringSecurityDescriptorToSecurityDescriptor := GetProcAddress(AdvapiDll(), 'ConvertStringSecurityDescriptorToSecurityDescriptorW'); result := false; if ConvertStringSecurityDescriptorToSecurityDescriptor('S:(ML;;NW;;;LW)D:(A;;0x120083;;;WD)(A;;0x120083;;;AC)', SDDL_REVISION_1, pSD, nil) then begin SD := pSD; result := true; end; end; function TPipeServer.Start: boolean; var SD: PSECURITY_DESCRIPTOR; SecurityAttributes: SECURITY_ATTRIBUTES; begin result := false; if Win32MajorVersion >= 6 then begin if CreateAppContainerSecurityDescriptor(SD) then begin SecurityAttributes.nLength := sizeof(SECURITY_ATTRIBUTES); SecurityAttributes.bInheritHandle := true; SecurityAttributes.lpSecurityDescriptor := SD; PipeHandle := CreateNamedPipe('\\.\pipe\MyPipe', PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE or PIPE_READMODE_BYTE, 1, 0, 0, 1000, @SecurityAttributes); result := PipeHandle <> INVALID_HANDLE_VALUE; end; end; end; procedure TPipeServer.Execute; begin if Start() then begin while true do begin if ConnectNamedPipe(PipeHandle, nil) then begin ... end; end; end; end;
Connection to a pipe in the IE toolbar (C ++)
#define PIPE_NAME "\\\\.\\pipe\\MYPipe" LRESULT CMFToolbar::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { ... HANDLE PipeHandle; if (WaitNamedPipe(PIPE_NAME, NMPWAIT_WAIT_FOREVER) != 0) { PipeHandle = CreateFile(PIPE_NAME, FILE_READ_DATA | FILE_WRITE_DATA, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (PipeHandle != INVALID_HANDLE_VALUE) { WriteFile(PipeHandle, ... CloseHandle(PipeHandle); } }
source share