{
                DWORD           size_high;
                DWORD           size_low;
+               DWORD           errcode;
 
                /* Shifts >= the width of the type are undefined. */
 #ifdef _WIN64
                                                                 size_high,             /* Upper 32 bits of size */
                                                                 size_low,              /* Lower 32 bits of size */
                                                                 name);
+
+               errcode = GetLastError();
+               if (errcode == ERROR_ALREADY_EXISTS || errcode == ERROR_ACCESS_DENIED)
+               {
+                       /*
+                        * On Windows, when the segment already exists, a handle for the
+                        * existing segment is returned.  We must close it before
+                        * returning.  However, if the existing segment is created by a
+                        * service, then it returns ERROR_ACCESS_DENIED. We don't do
+                        * _dosmaperr here, so errno won't be modified.
+                        */
+                       if (hmap)
+                               CloseHandle(hmap);
+                       return false;
+               }
+
                if (!hmap)
                {
-                       _dosmaperr(GetLastError());
+                       _dosmaperr(errcode);
                        ereport(elevel,
                                        (errcode_for_dynamic_shared_memory(),
                                  errmsg("could not create shared memory segment \"%s\": %m",
                                                 name)));
                        return false;
                }
-               _dosmaperr(GetLastError());
-               if (errno == EEXIST)
-               {
-                       /*
-                        * On Windows, when the segment already exists, a handle for the
-                        * existing segment is returned.  We must close it before
-                        * returning.  We don't do _dosmaperr here, so errno won't be
-                        * modified.
-                        */
-                       CloseHandle(hmap);
-                       return false;
-               }
        }
        else
        {