mirror of
https://github.com/PowerShell/Win32-OpenSSH.git
synced 2025-07-21 21:14:51 +02:00
cleaning up of unwanted sources in win32compat
This commit is contained in:
parent
c441f456bc
commit
54c90f1072
@ -147,9 +147,6 @@
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\conio.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\console.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\daemon.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\deskright.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\gettimeofday.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\homedirhelp.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\kerberos.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\startupneeds.c" />
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\strcasecmp.c" />
|
||||
|
@ -45,15 +45,6 @@
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\daemon.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\deskright.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\gettimeofday.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\homedirhelp.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="$(OpenSSH-Src-Path)\contrib\win32\win32compat\kerberos.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
@ -31,7 +31,4 @@
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
int daemon(int nochdir, int noclose)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,827 +0,0 @@
|
||||
/*
|
||||
* Author: NoMachine <developers@nomachine.com>
|
||||
*
|
||||
* Copyright (c) 2009, 2011 NoMachine
|
||||
* All rights reserved
|
||||
*
|
||||
* Support functions and system calls' replacements needed to let the
|
||||
* software run on Win32 based operating systems.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "deskright.h"
|
||||
|
||||
/*
|
||||
* Retrieve SID from access token.
|
||||
*
|
||||
* hToken - access token (IN)
|
||||
* psid - user's SID (OUT)
|
||||
*
|
||||
* RETURNS: TRUE if OK.
|
||||
*/
|
||||
|
||||
BOOL ObtainSid(HANDLE hToken, PSID *psid)
|
||||
{
|
||||
debug3("-> ObtainSid()...");
|
||||
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
DWORD dwIndex;
|
||||
|
||||
DWORD dwLength = 0;
|
||||
|
||||
TOKEN_INFORMATION_CLASS tic = TokenGroups;
|
||||
|
||||
PTOKEN_GROUPS ptg = NULL;
|
||||
|
||||
/*
|
||||
* determine the size of the buffer
|
||||
*/
|
||||
|
||||
if (!GetTokenInformation(hToken, tic, (LPVOID) ptg, 0, &dwLength))
|
||||
{
|
||||
FAIL(GetLastError() != ERROR_INSUFFICIENT_BUFFER);
|
||||
|
||||
ptg = (PTOKEN_GROUPS) HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY, dwLength);
|
||||
|
||||
FAIL(ptg == NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* obtain the groups the access token belongs to
|
||||
*/
|
||||
|
||||
FAIL(GetTokenInformation(hToken, tic, (LPVOID) ptg,
|
||||
dwLength, &dwLength) == FALSE);
|
||||
|
||||
/*
|
||||
* determine which group is the logon sid
|
||||
*/
|
||||
|
||||
for (dwIndex = 0; dwIndex < ptg -> GroupCount; dwIndex++)
|
||||
{
|
||||
if ((ptg -> Groups[dwIndex].Attributes & SE_GROUP_LOGON_ID) == SE_GROUP_LOGON_ID)
|
||||
{
|
||||
/*
|
||||
* determine the length of the sid
|
||||
*/
|
||||
|
||||
dwLength = GetLengthSid(ptg -> Groups[dwIndex].Sid);
|
||||
|
||||
/*
|
||||
* allocate a buffer for the logon sid
|
||||
*/
|
||||
|
||||
*psid = (PSID) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);
|
||||
|
||||
FAIL(*psid == NULL);
|
||||
|
||||
/*
|
||||
* obtain a copy of the logon sid
|
||||
*/
|
||||
|
||||
FAIL(CopySid(dwLength, *psid, ptg -> Groups[dwIndex].Sid) == FALSE);
|
||||
|
||||
/*
|
||||
* Break out of the loop because the logon sid has been
|
||||
* found.
|
||||
*/
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Indicate success.
|
||||
*/
|
||||
|
||||
bSuccess = TRUE;
|
||||
|
||||
fail:
|
||||
|
||||
/*
|
||||
* Free the buffer for the token group.
|
||||
*/
|
||||
|
||||
if (ptg != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, (LPVOID)ptg);
|
||||
}
|
||||
|
||||
debug3("<- ObtainSid()...");
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gives or removes user rights to use given WinStation object.
|
||||
*
|
||||
* WARNING. This rights is given only for login session, i.e,
|
||||
* acount's properties are not be changed.
|
||||
*
|
||||
* hwinsta - handle to WindowsStation object (IN)
|
||||
* psid - pointer to user's SID (IN)
|
||||
* mode - 1 for add, 0 for remove right (IN)
|
||||
*
|
||||
* RETURNS: TRUE if OK.
|
||||
*/
|
||||
|
||||
BOOL ModifyTheAceWindowStation(HWINSTA hwinsta, PSID psid, int mode)
|
||||
{
|
||||
debug2("-> ModifyTheAceWindowStation(mode = %d)...", mode);
|
||||
|
||||
ACCESS_ALLOWED_ACE *pace = NULL;
|
||||
|
||||
ACL_SIZE_INFORMATION aclSizeInfo;
|
||||
|
||||
BOOL bDaclExist;
|
||||
BOOL bDaclPresent;
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
DWORD dwNewAclSize;
|
||||
DWORD dwSidSize = 0;
|
||||
DWORD dwSdSizeNeeded;
|
||||
|
||||
PACL pacl;
|
||||
PACL pNewAcl = NULL;
|
||||
|
||||
PSECURITY_DESCRIPTOR psd = NULL;
|
||||
PSECURITY_DESCRIPTOR psdNew = NULL;
|
||||
|
||||
ACCESS_ALLOWED_ACE *pTempAce;
|
||||
|
||||
SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
|
||||
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* is input SID valid?
|
||||
*/
|
||||
|
||||
debug3("Testing is SID valid...");
|
||||
|
||||
FAIL(psid == NULL);
|
||||
|
||||
FAIL(IsValidSid(psid) == FALSE);
|
||||
|
||||
/*
|
||||
* obtain the dacl for the windowstation
|
||||
*/
|
||||
|
||||
debug3("GetUserObjectSecurity()...");
|
||||
|
||||
if (!GetUserObjectSecurity(hwinsta, &si, psd, dwSidSize, &dwSdSizeNeeded))
|
||||
{
|
||||
FAIL(GetLastError() != ERROR_INSUFFICIENT_BUFFER);
|
||||
|
||||
psd = (PSECURITY_DESCRIPTOR) HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
dwSdSizeNeeded);
|
||||
|
||||
FAIL(psd == NULL);
|
||||
|
||||
psdNew = (PSECURITY_DESCRIPTOR) HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
dwSdSizeNeeded);
|
||||
|
||||
FAIL(psdNew == NULL);
|
||||
|
||||
dwSidSize = dwSdSizeNeeded;
|
||||
|
||||
FAIL(GetUserObjectSecurity(hwinsta, &si, psd,
|
||||
dwSidSize, &dwSdSizeNeeded) == FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a new dacl.
|
||||
*/
|
||||
|
||||
debug3("InitializeSecurityDescriptor()...");
|
||||
|
||||
FAIL(InitializeSecurityDescriptor(psdNew, SECURITY_DESCRIPTOR_REVISION) == FALSE);
|
||||
|
||||
/*
|
||||
* get dacl from the security descriptor.
|
||||
*/
|
||||
|
||||
debug3("GetSecurityDescriptorDacl()...");
|
||||
|
||||
FAIL(GetSecurityDescriptorDacl(psd, &bDaclPresent, &pacl, &bDaclExist) == FALSE);
|
||||
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
|
||||
ZeroMemory(&aclSizeInfo, sizeof(ACL_SIZE_INFORMATION));
|
||||
aclSizeInfo.AclBytesInUse = sizeof(ACL);
|
||||
|
||||
/*
|
||||
* Call only if the dacl is not NULL.
|
||||
*/
|
||||
|
||||
if (pacl != NULL)
|
||||
{
|
||||
/*
|
||||
* Get the file ACL size info.
|
||||
*/
|
||||
|
||||
debug3("GetAclInformation()...");
|
||||
|
||||
FAIL(GetAclInformation(pacl, (LPVOID) &aclSizeInfo,
|
||||
sizeof(ACL_SIZE_INFORMATION),
|
||||
AclSizeInformation) == FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the size of the new acl.
|
||||
*/
|
||||
|
||||
debug3("Calculating dwNewAclSize...");
|
||||
|
||||
dwNewAclSize = aclSizeInfo.AclBytesInUse;
|
||||
|
||||
if (mode == ADD_RIGHT)
|
||||
{
|
||||
dwNewAclSize = dwNewAclSize + (2 * GetLengthSid(psid))
|
||||
+ (2 * sizeof(ACCESS_ALLOWED_ACE))
|
||||
- (2 * sizeof(DWORD));
|
||||
}
|
||||
else
|
||||
{
|
||||
dwNewAclSize = dwNewAclSize + (2 * GetLengthSid(psid))
|
||||
- (2 * sizeof(ACCESS_ALLOWED_ACE))
|
||||
+ (2 * sizeof(DWORD));
|
||||
}
|
||||
|
||||
debug3("dwNewAclSize = %d", dwNewAclSize);
|
||||
|
||||
/*
|
||||
* Allocate memory for the new acl.
|
||||
*/
|
||||
|
||||
debug3("HeapAlloc()...");
|
||||
|
||||
pNewAcl = (PACL) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwNewAclSize);
|
||||
|
||||
FAIL(pNewAcl == NULL);
|
||||
|
||||
/*
|
||||
* Initialize the new dacl.
|
||||
*/
|
||||
|
||||
debug3("InitializeAcl()...");
|
||||
|
||||
FAIL(InitializeAcl(pNewAcl, dwNewAclSize, ACL_REVISION) == FALSE);
|
||||
|
||||
/*
|
||||
* If DACL is present, copy it to a new DACL.
|
||||
*/
|
||||
|
||||
if (bDaclPresent)
|
||||
{
|
||||
/*
|
||||
* Copy the ACEs from old to new ACL.
|
||||
*/
|
||||
|
||||
if (aclSizeInfo.AceCount)
|
||||
{
|
||||
|
||||
debug3("aclSizeInfo.AceCount = %d", aclSizeInfo.AceCount);
|
||||
|
||||
for (i = 0; i < aclSizeInfo.AceCount; i++)
|
||||
{
|
||||
/*
|
||||
* Get next ACE from old ACL.
|
||||
*/
|
||||
|
||||
FAIL(GetAce(pacl, i, &pTempAce) == FALSE);
|
||||
|
||||
/*
|
||||
* Add the ACE to the new ACL.
|
||||
*
|
||||
* We copy all original list for RIGHT_ADD mode and
|
||||
* skip ACE with given input SID in RIGHT_REMOVE mode.
|
||||
*/
|
||||
|
||||
if (mode == ADD_RIGHT || EqualSid(psid, &pTempAce -> SidStart) == 0)
|
||||
{
|
||||
FAIL(AddAce(pNewAcl, ACL_REVISION, MAXDWORD, pTempAce,
|
||||
((PACE_HEADER) pTempAce) -> AceSize) == FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == ADD_RIGHT)
|
||||
{
|
||||
/*
|
||||
* Add the first ACE to the windowstation.
|
||||
*/
|
||||
|
||||
pace = (ACCESS_ALLOWED_ACE *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||
sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(psid) - sizeof(DWORD));
|
||||
|
||||
FAIL(pace == NULL);
|
||||
|
||||
pace -> Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
|
||||
pace -> Header.AceFlags = CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE | OBJECT_INHERIT_ACE;
|
||||
pace -> Header.AceSize = sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(psid) - sizeof(DWORD);
|
||||
pace -> Mask = GENERIC_ACCESS;
|
||||
|
||||
debug3("CopySid()...");
|
||||
|
||||
FAIL(CopySid(GetLengthSid(psid), &pace -> SidStart, psid) == FALSE);
|
||||
|
||||
debug3("AddAce()...");
|
||||
|
||||
FAIL(AddAce(pNewAcl, ACL_REVISION, MAXDWORD,
|
||||
(LPVOID)pace, pace -> Header.AceSize) == FALSE);
|
||||
|
||||
/*
|
||||
* Add the second ACE to the windowstation.
|
||||
*/
|
||||
|
||||
pace -> Header.AceFlags = NO_PROPAGATE_INHERIT_ACE;
|
||||
pace -> Mask = WINSTA_ALL;
|
||||
|
||||
debug3("AddAce()...");
|
||||
|
||||
FAIL(AddAce(pNewAcl, ACL_REVISION, MAXDWORD,
|
||||
(LPVOID) pace, pace -> Header.AceSize) == FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set new dacl for the security descriptor.
|
||||
*/
|
||||
|
||||
debug3("SetSecurityDescriptorDacl()...");
|
||||
|
||||
FAIL(SetSecurityDescriptorDacl(psdNew, TRUE, pNewAcl, FALSE) == FALSE);
|
||||
|
||||
/*
|
||||
* Set the new security descriptor for the windowstation.
|
||||
*/
|
||||
|
||||
debug3("SetUserObjectSecurity()...");
|
||||
|
||||
FAIL(SetUserObjectSecurity(hwinsta, &si, psdNew) == FALSE);
|
||||
|
||||
/*
|
||||
* Indicate success.
|
||||
*/
|
||||
|
||||
bSuccess = TRUE;
|
||||
|
||||
fail:
|
||||
|
||||
/*
|
||||
* Free the allocated buffers.
|
||||
*/
|
||||
|
||||
if (pace != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, (LPVOID)pace);
|
||||
}
|
||||
|
||||
if (pNewAcl != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, (LPVOID)pNewAcl);
|
||||
}
|
||||
|
||||
if (psd != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, (LPVOID)psd);
|
||||
}
|
||||
|
||||
if (psdNew != NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, (LPVOID)psdNew);
|
||||
}
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gives ore removes user right to use given desktop.
|
||||
*
|
||||
* WARNING. This right is given only for login session, i.e,
|
||||
* account's properties are not be changed.
|
||||
*
|
||||
* hdesk - handle to desktop (IN)
|
||||
* psid - pointer to user's SID (IN)
|
||||
* mode - 1 for add, 0 for remove (IN)
|
||||
*
|
||||
* RETURNS: TRUE if OK.
|
||||
*/
|
||||
|
||||
BOOL ModifyTheAceDesktop(HDESK hdesk, PSID psid, int mode)
|
||||
{
|
||||
debug2("-> ModifyTheAceDesktop(mode = %d)...", mode);
|
||||
|
||||
ACL_SIZE_INFORMATION aclSizeInfo;
|
||||
|
||||
BOOL bDaclExist;
|
||||
BOOL bDaclPresent;
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
DWORD dwNewAclSize;
|
||||
DWORD dwSidSize = 0;
|
||||
DWORD dwSdSizeNeeded;
|
||||
|
||||
PACL pacl;
|
||||
PACL pNewAcl;
|
||||
|
||||
PSECURITY_DESCRIPTOR psd = NULL;
|
||||
PSECURITY_DESCRIPTOR psdNew = NULL;
|
||||
|
||||
HANDLE procHeap = NULL;
|
||||
|
||||
ACCESS_ALLOWED_ACE *pTempAce;
|
||||
|
||||
SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
|
||||
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
* is input SID valid?
|
||||
*/
|
||||
|
||||
debug3("Testing is SID valid...");
|
||||
|
||||
FAIL(psid == NULL);
|
||||
|
||||
FAIL(IsValidSid(psid) == FALSE);
|
||||
|
||||
/*
|
||||
* Obtain process heap.
|
||||
*/
|
||||
|
||||
procHeap = GetProcessHeap();
|
||||
|
||||
/*
|
||||
* Obtain the security descriptor for the desktop object.
|
||||
*/
|
||||
|
||||
debug3("GetUserObjectSecurity()...");
|
||||
|
||||
if (!GetUserObjectSecurity(hdesk, &si, psd,
|
||||
dwSidSize, &dwSdSizeNeeded))
|
||||
{
|
||||
FAIL(GetLastError() != ERROR_INSUFFICIENT_BUFFER);
|
||||
|
||||
psd = (PSECURITY_DESCRIPTOR) HeapAlloc(procHeap,
|
||||
HEAP_ZERO_MEMORY,
|
||||
dwSdSizeNeeded);
|
||||
|
||||
FAIL(psd == NULL);
|
||||
|
||||
psdNew = (PSECURITY_DESCRIPTOR)HeapAlloc(procHeap,
|
||||
HEAP_ZERO_MEMORY,
|
||||
dwSdSizeNeeded);
|
||||
|
||||
FAIL(psdNew == NULL);
|
||||
|
||||
dwSidSize = dwSdSizeNeeded;
|
||||
|
||||
FAIL(GetUserObjectSecurity(hdesk, &si, psd, dwSidSize,
|
||||
&dwSdSizeNeeded) == FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* create a new security descriptor.
|
||||
*/
|
||||
|
||||
debug3("InitializeSecurityDescriptor()...");
|
||||
|
||||
FAIL(InitializeSecurityDescriptor(psdNew,
|
||||
SECURITY_DESCRIPTOR_REVISION) == FALSE);
|
||||
|
||||
/*
|
||||
* obtain the dacl from the security descriptor.
|
||||
*/
|
||||
|
||||
debug3("GetSecurityDescriptorDacl()...");
|
||||
|
||||
FAIL(GetSecurityDescriptorDacl(psd, &bDaclPresent,
|
||||
&pacl, &bDaclExist) == FALSE);
|
||||
|
||||
/*
|
||||
* Initialize.
|
||||
*/
|
||||
|
||||
ZeroMemory(&aclSizeInfo, sizeof(ACL_SIZE_INFORMATION));
|
||||
|
||||
aclSizeInfo.AclBytesInUse = sizeof(ACL);
|
||||
|
||||
/*
|
||||
* Call only if NULL dacl.
|
||||
*/
|
||||
|
||||
if (pacl != NULL)
|
||||
{
|
||||
/*
|
||||
* determine the size of the ACL info.
|
||||
*/
|
||||
|
||||
debug3("GetAclInformation()..");
|
||||
|
||||
FAIL(GetAclInformation(pacl, (LPVOID)&aclSizeInfo,
|
||||
sizeof(ACL_SIZE_INFORMATION),
|
||||
AclSizeInformation) == FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the size of the new acl.
|
||||
*/
|
||||
|
||||
dwNewAclSize = aclSizeInfo.AclBytesInUse;
|
||||
|
||||
if (mode == ADD_RIGHT)
|
||||
{
|
||||
dwNewAclSize = dwNewAclSize + sizeof(ACCESS_ALLOWED_ACE)
|
||||
+ GetLengthSid(psid) - sizeof(DWORD);
|
||||
}
|
||||
else
|
||||
{
|
||||
dwNewAclSize = dwNewAclSize - sizeof(ACCESS_ALLOWED_ACE)
|
||||
- GetLengthSid(psid) + sizeof(DWORD);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate buffer for the new acl.
|
||||
*/
|
||||
|
||||
pNewAcl = (PACL) HeapAlloc(procHeap,
|
||||
HEAP_ZERO_MEMORY, dwNewAclSize);
|
||||
|
||||
FAIL(pNewAcl == NULL);
|
||||
|
||||
/*
|
||||
* Initialize the new acl.
|
||||
*/
|
||||
|
||||
debug3("InitializeAcl()..");
|
||||
|
||||
FAIL(InitializeAcl(pNewAcl, dwNewAclSize, ACL_REVISION) == FALSE);
|
||||
|
||||
/*
|
||||
* If DACL is present, copy it to a new DACL.
|
||||
*/
|
||||
|
||||
if (bDaclPresent) // only copy if DACL was present
|
||||
{
|
||||
/*
|
||||
* Copy the ACEs to our new ACL.
|
||||
*/
|
||||
|
||||
if (aclSizeInfo.AceCount)
|
||||
{
|
||||
|
||||
for (i=0; i < aclSizeInfo.AceCount; i++)
|
||||
{
|
||||
/*
|
||||
* Get next ACE from old ACL.
|
||||
*/
|
||||
|
||||
FAIL(GetAce(pacl, i, &pTempAce) == FALSE);
|
||||
|
||||
/*
|
||||
* Add the ACE to the new ACL.
|
||||
*
|
||||
* We copy all original list for RIGHT_ADD mode and
|
||||
* skip ACE with given input SID in RIGHT_REMOVE mode.
|
||||
*/
|
||||
|
||||
if (mode == ADD_RIGHT || EqualSid(psid, &pTempAce -> SidStart) == 0)
|
||||
{
|
||||
FAIL(AddAce(pNewAcl, ACL_REVISION, MAXDWORD, pTempAce,
|
||||
((PACE_HEADER) pTempAce) -> AceSize) == FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == ADD_RIGHT)
|
||||
{
|
||||
/*
|
||||
* Add one additional ace to the dacl.
|
||||
*/
|
||||
|
||||
debug3("AccessAllowedAce()...");
|
||||
|
||||
FAIL(AddAccessAllowedAce(pNewAcl, ACL_REVISION,
|
||||
DESKTOP_ALL, psid) == FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set new dacl to the new security descriptor.
|
||||
*/
|
||||
|
||||
debug3("AddSecurityDescriptiorDacl()..");
|
||||
|
||||
FAIL(SetSecurityDescriptorDacl(psdNew, TRUE, pNewAcl, FALSE) == FALSE);
|
||||
|
||||
/*
|
||||
* Set the new security descriptor for the desktop object.
|
||||
*/
|
||||
|
||||
debug3("SetUserObjectSecurity()..");
|
||||
|
||||
FAIL(SetUserObjectSecurity(hdesk, &si, psdNew) == FALSE);
|
||||
|
||||
/*
|
||||
* Indicate success.
|
||||
*/
|
||||
|
||||
bSuccess = TRUE;
|
||||
|
||||
fail:
|
||||
|
||||
/*
|
||||
* Free buffers.
|
||||
*/
|
||||
|
||||
debug3("Freeing buffers...");
|
||||
|
||||
if (pNewAcl != NULL)
|
||||
{
|
||||
HeapFree(procHeap, 0, (LPVOID) pNewAcl);
|
||||
}
|
||||
|
||||
if (psd != NULL)
|
||||
{
|
||||
HeapFree(procHeap, 0, (LPVOID) psd);
|
||||
}
|
||||
|
||||
if (psdNew != NULL)
|
||||
{
|
||||
HeapFree(procHeap, 0, (LPVOID) psdNew);
|
||||
}
|
||||
|
||||
debug3("<- AddTheAceDesktop()...");
|
||||
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
void RemoveSid(PSID *psid)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, (LPVOID) *psid);
|
||||
}
|
||||
|
||||
/*
|
||||
* Gives user rights to use 'WinStation0' and 'default' desktop.
|
||||
*
|
||||
* psid - pointer to SID for acount SID (IN)
|
||||
* mode - 1 for add, 0 for remove (IN)
|
||||
*
|
||||
* RETURNS: 0 if OK.
|
||||
*/
|
||||
|
||||
int ModifyRightsToDesktopBySid(PSID psid, int mode)
|
||||
{
|
||||
debug3("-> ModifyRightsToDesktopBySid(mode = %d)...", mode);
|
||||
|
||||
HDESK hdesk = NULL;
|
||||
|
||||
HWINSTA hwinsta = NULL;
|
||||
|
||||
int exitCode = -1;
|
||||
|
||||
/*
|
||||
* obtain a handle to the interactive windowstation.
|
||||
*/
|
||||
|
||||
debug3("OpenWindowStation()...");
|
||||
|
||||
hwinsta = OpenWindowStation("winsta0", FALSE, READ_CONTROL | WRITE_DAC);
|
||||
|
||||
FAIL(hwinsta == NULL);
|
||||
|
||||
debug3("GetProcessWindowStation()...");
|
||||
|
||||
HWINSTA hwinstaold = GetProcessWindowStation();
|
||||
|
||||
/*
|
||||
* Set the windowstation to winsta0 so that you obtain the
|
||||
* correct default desktop.
|
||||
*/
|
||||
|
||||
debug3("SetProcessWindowStation()...");
|
||||
|
||||
FAIL(!SetProcessWindowStation(hwinsta));
|
||||
|
||||
/*
|
||||
* Obtain a handle to the "default" desktop.
|
||||
*/
|
||||
|
||||
debug3("OpenDesktop()...");
|
||||
|
||||
hdesk = OpenDesktop("default", 0, FALSE, READ_CONTROL | WRITE_DAC |
|
||||
DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS);
|
||||
|
||||
FAIL(hdesk == NULL);
|
||||
|
||||
/*
|
||||
* Add the user to interactive windowstation.
|
||||
*/
|
||||
|
||||
debug3("ModifyTheAceWindowStation()...");
|
||||
|
||||
FAIL(!ModifyTheAceWindowStation(hwinsta, psid, mode));
|
||||
|
||||
/*
|
||||
* Add user to "default" desktop.
|
||||
*/
|
||||
|
||||
debug3("AddTheAceDesktop()...");
|
||||
|
||||
FAIL(!ModifyTheAceDesktop(hdesk, psid, mode));
|
||||
|
||||
exitCode = 0;
|
||||
|
||||
fail:
|
||||
|
||||
/*
|
||||
* Close the handles to the interactive windowstation and desktop.
|
||||
*/
|
||||
|
||||
debug3("CloseWindowStation()...");
|
||||
|
||||
if (hwinsta)
|
||||
{
|
||||
CloseWindowStation(hwinsta);
|
||||
}
|
||||
|
||||
debug3("CloseDesktop()...");
|
||||
|
||||
if (hdesk)
|
||||
{
|
||||
CloseDesktop(hdesk);
|
||||
}
|
||||
|
||||
debug3("<- ModifyRightsToDesktopBySid()...");
|
||||
|
||||
return exitCode;
|
||||
}
|
||||
|
||||
/*
|
||||
* Gives or removes user rights to use 'WinStation0' and 'default' desktop.
|
||||
*
|
||||
* hToken - logged user's token (IN)
|
||||
* mode - 1 for add, 0 for remove (IN)
|
||||
*
|
||||
* RETURNS: 0 if OK.
|
||||
*/
|
||||
|
||||
int ModifyRightsToDesktop(HANDLE hToken, int mode)
|
||||
{
|
||||
debug2("-> ModifyRightsToDesktop(mode = %d)...", mode);
|
||||
|
||||
PSID psid = NULL;
|
||||
|
||||
int exitCode = -1;
|
||||
|
||||
/*
|
||||
* Obtain the logon sid of the user fester.
|
||||
*/
|
||||
|
||||
debug3("ObtainSid()...");
|
||||
|
||||
FAIL(!ObtainSid(hToken, &psid));
|
||||
|
||||
FAIL(ModifyRightsToDesktopBySid(psid, mode));
|
||||
|
||||
if (psid)
|
||||
{
|
||||
RemoveSid(&psid);
|
||||
}
|
||||
|
||||
exitCode = 0;
|
||||
|
||||
fail:
|
||||
|
||||
debug2("<- ModifyRightsToDesktop()...");
|
||||
|
||||
return exitCode;
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Author: NoMachine <developers@nomachine.com>
|
||||
*
|
||||
* Copyright (c) 2009, 2011 NoMachine
|
||||
* All rights reserved
|
||||
*
|
||||
* Support functions and system calls' replacements needed to let the
|
||||
* software run on Win32 based operating systems.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef DeskRight_H
|
||||
#define DeskRight_H
|
||||
|
||||
#include "includes.h"
|
||||
#include "Debug.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#define ADD_RIGHT 1
|
||||
#define REMOVE_RIGHT 0
|
||||
|
||||
#define WINSTA_ALL (WINSTA_ACCESSCLIPBOARD | WINSTA_ACCESSGLOBALATOMS | \
|
||||
WINSTA_CREATEDESKTOP | WINSTA_ENUMDESKTOPS | \
|
||||
WINSTA_ENUMERATE | WINSTA_EXITWINDOWS | \
|
||||
WINSTA_READATTRIBUTES | WINSTA_READSCREEN | \
|
||||
WINSTA_WRITEATTRIBUTES | DELETE | \
|
||||
READ_CONTROL | WRITE_DAC | \
|
||||
WRITE_OWNER)
|
||||
|
||||
#define DESKTOP_ALL (DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | \
|
||||
DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | \
|
||||
DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | \
|
||||
DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | \
|
||||
DESKTOP_WRITEOBJECTS | DELETE | \
|
||||
READ_CONTROL | WRITE_DAC | \
|
||||
WRITE_OWNER)
|
||||
|
||||
#define GENERIC_ACCESS (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL)
|
||||
|
||||
int ModifyRightsToDesktop(HANDLE hToken, int mode);
|
||||
int ModifyRightsToDesktopBySid(PSID psid, int mode);
|
||||
|
||||
#endif
|
@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Author: NoMachine <developers@nomachine.com>
|
||||
*
|
||||
* Copyright (c) 2009, 2010 NoMachine
|
||||
* All rights reserved
|
||||
*
|
||||
* Support functions and system calls' replacements needed to let the
|
||||
* software run on Win32 based operating systems.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
/* Difference in us between UNIX Epoch and Win32 Epoch */
|
||||
#define EPOCH_DELTA_US 11644473600000000ULL
|
||||
|
||||
int
|
||||
gettimeofday (struct timeval *tv, void *tz)
|
||||
{
|
||||
union
|
||||
{
|
||||
FILETIME ft;
|
||||
unsigned long long ns;
|
||||
} timehelper;
|
||||
unsigned long long us;
|
||||
|
||||
/* Fetch time since Jan 1, 1601 in 100ns increments */
|
||||
GetSystemTimeAsFileTime(&timehelper.ft);
|
||||
|
||||
/* Convert to microseconds from 100 ns units */
|
||||
us = timehelper.ns / 10;
|
||||
|
||||
/* Remove the epoch difference */
|
||||
us -= EPOCH_DELTA_US;
|
||||
|
||||
/* Stuff result into the timeval */
|
||||
tv->tv_sec = (long) (us / 1000000ULL);
|
||||
tv->tv_usec = (long) (us % 1000000ULL);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,165 +0,0 @@
|
||||
/*
|
||||
* Author: NoMachine <developers@nomachine.com>
|
||||
*
|
||||
* Copyright (c) 2009, 2011 NoMachine
|
||||
* All rights reserved
|
||||
*
|
||||
* Support functions and system calls' replacements needed to let the
|
||||
* software run on Win32 based operating systems.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
#include <Lmcons.h>
|
||||
#include <Lm.h>
|
||||
#include <Userenv.h>
|
||||
#include <shlobj.h>
|
||||
#include <Shlwapi.h>
|
||||
|
||||
#include "win32auth.h"
|
||||
|
||||
wchar_t HomeDirLsaW[MAX_PATH] = {L'\0'};
|
||||
|
||||
wchar_t *gethomedir_w(char *pUserName, char *pDomainName)
|
||||
{
|
||||
HANDLE token;
|
||||
|
||||
PROFILEINFOW profileInfo;
|
||||
|
||||
wchar_t szPathW[MAX_PATH] = {0};
|
||||
|
||||
wchar_t pUserName_w[UNLEN + 1] = {0};
|
||||
|
||||
static wchar_t username_w[UNLEN + 1] = {0};
|
||||
|
||||
DWORD usernamelen = UNLEN + 1;
|
||||
|
||||
wchar_t pDomainName_w[UNLEN + 1] = {0};
|
||||
|
||||
wchar_t *userprofile_w;
|
||||
|
||||
/*
|
||||
* If there is home dir from lsa return it.
|
||||
*/
|
||||
|
||||
if (HomeDirLsaW[0] != L'\0')
|
||||
{
|
||||
debug("Using LSA HomeDirW.");
|
||||
|
||||
return _wcsdup(HomeDirLsaW);
|
||||
}
|
||||
|
||||
szPathW[0] = '\0';
|
||||
|
||||
if (MultiByteToWideChar(CP_UTF8, 0, pUserName, -1, pUserName_w, UNLEN) == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pDomainName &&
|
||||
MultiByteToWideChar(CP_UTF8, 0, pDomainName,
|
||||
-1, pDomainName_w, UNLEN) == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
debug3("gethomedir: pUserName [%s]", pUserName);
|
||||
|
||||
GetUserNameW(username_w, &usernamelen);
|
||||
|
||||
debug3("gethomedir: username [%ls]", username_w);
|
||||
|
||||
if (wcscmp(pUserName_w, username_w) == 0)
|
||||
{
|
||||
/*
|
||||
* User query his own home dir, we can take it from env.
|
||||
*/
|
||||
|
||||
debug3("gethomedir: getenv");
|
||||
|
||||
userprofile_w = _wgetenv(L"USERPROFILE");
|
||||
|
||||
if (userprofile_w)
|
||||
{
|
||||
debug3("gethomedir: userprofile [%ls]", userprofile_w);
|
||||
|
||||
/*
|
||||
* We have a %USERPROFILE% and we can return it
|
||||
*/
|
||||
|
||||
return _wcsdup(userprofile_w);
|
||||
}
|
||||
|
||||
/*
|
||||
* Env not set, let's try to take it from token
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* If all above fail try to create user token manually
|
||||
* and get homedir using this token.
|
||||
*/
|
||||
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Retreave path, where current binary live.
|
||||
*
|
||||
* buffer - buffer, where path store (OUT)
|
||||
* bufSize - size of output buffer (IN)
|
||||
*
|
||||
* RETURNS: 0 if OK.
|
||||
*/
|
||||
|
||||
int GetRootBaseDir(char *buffer, int bufSize)
|
||||
{
|
||||
int exitCode = -1;
|
||||
|
||||
char *end = NULL;
|
||||
char *tmp = buffer;
|
||||
|
||||
FAIL(buffer == NULL);
|
||||
|
||||
FAIL(GetModuleFileName(NULL, buffer, bufSize) == FALSE);
|
||||
|
||||
FAIL(PathRemoveFileSpec(buffer) == FALSE);
|
||||
|
||||
while ((tmp = strstr(tmp, "\\bin")))
|
||||
{
|
||||
end = tmp;
|
||||
tmp++;
|
||||
}
|
||||
|
||||
FAIL(end == NULL);
|
||||
|
||||
*end = 0;
|
||||
|
||||
exitCode = 0;
|
||||
|
||||
fail:
|
||||
|
||||
return exitCode;
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
#include <sys\utime.h>
|
||||
|
||||
#define utimbuf _utimbuf
|
||||
int usleep(unsigned int);
|
||||
int usleep(unsigned int);
|
||||
int gettimeofday(struct timeval *tv, void *tz);
|
||||
|
@ -7,25 +7,15 @@
|
||||
#define COMPAT_UNISTD_H 1
|
||||
|
||||
#include "w32posix.h"
|
||||
//
|
||||
//#define pipe(a) w32_pipe((a))
|
||||
//#define open(a,b,...) w32_open((a), (b), __VA_ARGS__)
|
||||
//#define read(a,b,c) w32_read((a), (b), (c))
|
||||
//#define write(a,b,c) w32_write((a), (b), (c))
|
||||
#define isatty(a) w32_isatty((a))
|
||||
//#define close(a) w32_close((a))
|
||||
//#define dup(a) w32_dup((a))
|
||||
//#define dup2(a,b) w32_dup2((a), (b))
|
||||
//
|
||||
//#define sleep(sec) Sleep(1000 * sec)
|
||||
//#define alarm(a) w32_alarm((a))
|
||||
|
||||
#define pipe w32_pipe
|
||||
#define open w32_open
|
||||
#define read w32_read
|
||||
#define write w32_write
|
||||
#define writev w32_writev
|
||||
//#define isatty w32_isatty
|
||||
/* can't do this #define isatty w32_isatty
|
||||
* as there is a variable in code named isatty*/
|
||||
#define isatty(a) w32_isatty((a))
|
||||
#define close w32_close
|
||||
#define dup w32_dup
|
||||
#define dup2 w32_dup2
|
||||
@ -39,6 +29,8 @@
|
||||
|
||||
#define fopen w32_fopen_utf8
|
||||
|
||||
int daemon(int nochdir, int noclose);
|
||||
|
||||
/* Compatibility header to avoid lots of #ifdefs in includes.h on Win32 */
|
||||
|
||||
#include <conio.h>
|
||||
@ -52,8 +44,6 @@ size_t strcasecmp(const char *left, const char *right);
|
||||
size_t strncasecmp(const char *left, const char *right, size_t n);
|
||||
#endif
|
||||
|
||||
int gettimeofday(struct timeval *tv, void *tz);
|
||||
|
||||
#define popen _popen
|
||||
#define pclose _pclose
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <stdio.h>
|
||||
#include "inc\defs.h"
|
||||
#include "inc\sys\statvfs.h"
|
||||
#include "inc\sys\time.h"
|
||||
|
||||
int usleep(unsigned int useconds)
|
||||
{
|
||||
@ -9,6 +10,39 @@ int usleep(unsigned int useconds)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Difference in us between UNIX Epoch and Win32 Epoch */
|
||||
#define EPOCH_DELTA_US 11644473600000000ULL
|
||||
|
||||
/* This routine is contributed by * Author: NoMachine <developers@nomachine.com>
|
||||
* Copyright (c) 2009, 2010 NoMachine
|
||||
* All rights reserved
|
||||
*/
|
||||
int
|
||||
gettimeofday(struct timeval *tv, void *tz)
|
||||
{
|
||||
union
|
||||
{
|
||||
FILETIME ft;
|
||||
unsigned long long ns;
|
||||
} timehelper;
|
||||
unsigned long long us;
|
||||
|
||||
/* Fetch time since Jan 1, 1601 in 100ns increments */
|
||||
GetSystemTimeAsFileTime(&timehelper.ft);
|
||||
|
||||
/* Convert to microseconds from 100 ns units */
|
||||
us = timehelper.ns / 10;
|
||||
|
||||
/* Remove the epoch difference */
|
||||
us -= EPOCH_DELTA_US;
|
||||
|
||||
/* Stuff result into the timeval */
|
||||
tv->tv_sec = (long)(us / 1000000ULL);
|
||||
tv->tv_usec = (long)(us % 1000000ULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
explicit_bzero(void *b, size_t len) {
|
||||
SecureZeroMemory(b, len);
|
||||
@ -164,4 +198,10 @@ char* w32_programdir() {
|
||||
|
||||
return s_programdir;
|
||||
|
||||
}
|
||||
|
||||
int daemon(int nochdir, int noclose)
|
||||
{
|
||||
/* this should never be invoked from Windows code*/
|
||||
DebugBreak();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user