/* * @implemented */ HANDLE WINAPI CreateSemaphoreExW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName OPTIONAL, IN DWORD dwFlags, IN DWORD dwDesiredAccess) { NTSTATUS Status; OBJECT_ATTRIBUTES LocalAttributes; POBJECT_ATTRIBUTES ObjectAttributes; HANDLE Handle; UNICODE_STRING ObjectName; /* Now check if we got a name */ if (lpName) RtlInitUnicodeString(&ObjectName, lpName); if (dwFlags != 0) { SetLastError(ERROR_INVALID_PARAMETER); return NULL; } /* Now convert the object attributes */ ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, lpSemaphoreAttributes, lpName ? &ObjectName : NULL); /* Create the semaphore */ Status = NtCreateSemaphore(&Handle, (ACCESS_MASK)dwDesiredAccess, ObjectAttributes, lInitialCount, lMaximumCount); if (NT_SUCCESS(Status)) { /* Check if the object already existed */ if (Status == STATUS_OBJECT_NAME_EXISTS) { /* Set distinguished Win32 error code */ SetLastError(ERROR_ALREADY_EXISTS); } else { /* Otherwise, set success */ SetLastError(ERROR_SUCCESS); } /* Return the handle */ return Handle; } else { /* Convert the NT Status and fail */ SetLastErrorByStatus(Status); return NULL; } }
/* * @implemented */ HANDLE NTAPI CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName) { NTSTATUS Status; HANDLE SectionHandle; OBJECT_ATTRIBUTES LocalAttributes; POBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING SectionName; ACCESS_MASK DesiredAccess; LARGE_INTEGER LocalSize; PLARGE_INTEGER SectionSize = NULL; ULONG Attributes; /* Set default access */ DesiredAccess = STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ; /* Get the attributes for the actual allocation and cleanup flProtect */ Attributes = flProtect & (SEC_FILE | SEC_IMAGE | SEC_RESERVE | SEC_NOCACHE | SEC_COMMIT | SEC_LARGE_PAGES); flProtect ^= Attributes; /* If the caller didn't say anything, assume SEC_COMMIT */ if (!Attributes) Attributes = SEC_COMMIT; /* Now check if the caller wanted write access */ if (flProtect == PAGE_READWRITE) { /* Give it */ DesiredAccess |= (SECTION_MAP_WRITE | SECTION_MAP_READ); } /* Now check if we got a name */ if (lpName) RtlInitUnicodeString(&SectionName, lpName); /* Now convert the object attributes */ ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes, lpFileMappingAttributes, lpName ? &SectionName : NULL); /* Check if we got a size */ if (dwMaximumSizeLow || dwMaximumSizeHigh) { /* Use a LARGE_INTEGER and convert */ SectionSize = &LocalSize; SectionSize->LowPart = dwMaximumSizeLow; SectionSize->HighPart = dwMaximumSizeHigh; } /* Make sure the handle is valid */ if (hFile == INVALID_HANDLE_VALUE) { /* It's not, we'll only go on if we have a size */ hFile = NULL; if (!SectionSize) { /* No size, so this isn't a valid non-mapped section */ SetLastError(ERROR_INVALID_PARAMETER); return NULL; } } /* Now create the actual section */ Status = NtCreateSection(&SectionHandle, DesiredAccess, ObjectAttributes, SectionSize, flProtect, Attributes, hFile); if (Status == STATUS_OBJECT_NAME_EXISTS) { SetLastError(ERROR_ALREADY_EXISTS); return SectionHandle; } if (!NT_SUCCESS(Status)) { /* We failed */ BaseSetLastNTError(Status); return NULL; } SetLastError(ERROR_SUCCESS); /* Return the section */ return SectionHandle; }