What does it mean when CreateNamedPipe returns of 0xFFFFFFFF perror() says "NO ERROR'?


I am using CreateNamedPipe. It returns 0XFFFFFFFF but when I call GetLastError and perror I get "NO ERROR".

I have checked https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server and I heve coded very similar.

I coded this using an example provided here: https://stackoverflow.com/questions/47731784/c-createnamedpipe-error-path-not-found-3#= and he says it means ERROR_PATH_NOT_FOUND (3). But my address is "\\.\pipe\pipe_com1. Note that StackOverflow seems to remove the extra slashes but you will see them in the paste of my code.

I followed the example here: Create Named Pipe C++ Windows but I still get the error. Here is my code:

//  Create a named pipe
//  It is used to test TcpToNamedPipe to be sore it it is addressing the named pipe

    #include <windows.h>
    #include <stdio.h>
    #include <process.h>

    char    ch;
    int main(int nargs,  char** argv)
        if (nargs != 2)
            printf("Usage pipe name is first arg\n");
            printf("press any key to exit ");
            scanf("%c", &ch);
            return -1;

        char buffer[1024];
        HANDLE  hPipe;
        DWORD dwRead;
        sprintf(buffer, "\\\\.\\pipe\\%s", argv[1]);
        hPipe = CreateNamedPipe((LPCWSTR)buffer,
            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,    // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 

        if (hPipe == INVALID_HANDLE_VALUE)
            //int errorno = GetLastError();
            //printf("error creating pipe %d\n", errorno);
            printf("press any key to exit ");
            scanf("%c", &ch);
            return -1;

        while (hPipe != INVALID_HANDLE_VALUE)
            if (ConnectNamedPipe(hPipe, NULL) != FALSE)   // wait for someone to connect to the pipe
                while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE)
                    /* add terminating zero */
                    buffer[dwRead] = '\0';

                    /* do something with data in buffer */
                    printf("%s", buffer);


        return 0;

I'm guessing that the pointer to the address may be wrong and CreateNamedPipe is not seeing the name of the pipe properly. So I used disassembly and notice that the address is in fact a far pointer. Here is that disassembly:

00CA1A45  mov         esi,esp  
00CA1A47  push        0  
00CA1A49  push        0  
00CA1A4B  push        4000h  
00CA1A50  push        4000h  
00CA1A55  push        1  
00CA1A57  push        0  
00CA1A59  push        3  
00CA1A5B  lea         eax,[buffer]  
00CA1A61  push        eax  
00CA1A62  call        dword ptr [__imp__CreateNamedPipeW@32 (0CAB00Ch)] 

Can someone spot my problem?

asked on Stack Overflow Jan 29, 2020 by Aabbee • edited Jan 29, 2020 by Aabbee

0 Answers

Nobody has answered this question yet.

User contributions licensed under CC BY-SA 3.0