ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
August 2008
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
27 participants
853 discussions
Start a n
N
ew thread
[ekohl] 35755: - RCreateServiceW: - Add more parameter checks. - Set the services "ObjectName" value to "LocalSystem" if it doesn't have a name. - REnumServicesStatusW: Simplify it a little.
by ekohl@svn.reactos.org
Author: ekohl Date: Fri Aug 29 07:59:27 2008 New Revision: 35755 URL:
http://svn.reactos.org/svn/reactos?rev=35755&view=rev
Log: - RCreateServiceW: - Add more parameter checks. - Set the services "ObjectName" value to "LocalSystem" if it doesn't have a name. - REnumServicesStatusW: Simplify it a little. Modified: trunk/reactos/base/system/services/rpcserver.c Modified: trunk/reactos/base/system/services/rpcserver.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcse…
============================================================================== --- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Fri Aug 29 07:59:27 2008 @@ -1599,9 +1599,47 @@ return ERROR_ACCESS_DENIED; } - /* Fail if the service already exists! */ - if (ScmGetServiceEntryByName(lpServiceName) != NULL) + if (wcslen(lpServiceName) == 0) + { + return ERROR_INVALID_NAME; + } + + if (wcslen(lpBinaryPathName) == 0) + { + return ERROR_INVALID_PARAMETER; + } + + if ((dwServiceType == (SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS)) && + (lpServiceStartName)) + { + return ERROR_INVALID_PARAMETER; + } + + if ((dwServiceType > SERVICE_WIN32_SHARE_PROCESS) && + (dwServiceType != (SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS)) && + (dwServiceType != (SERVICE_WIN32_SHARE_PROCESS | SERVICE_INTERACTIVE_PROCESS))) + { + return ERROR_INVALID_PARAMETER; + } + + if (dwStartType > SERVICE_DISABLED) + { + return ERROR_INVALID_PARAMETER; + } + + lpService = ScmGetServiceEntryByName(lpServiceName); + if (lpService) + { + /* check if it is marked for deletion */ + if (lpService->bDeleted) + return ERROR_SERVICE_MARKED_FOR_DELETE; + /* Return Error exist */ return ERROR_SERVICE_EXISTS; + } + + if (lpDisplayName != NULL && + ScmGetServiceEntryByDisplayName(lpDisplayName) != NULL) + return ERROR_DUPLICATE_SERVICE_NAME; if (dwServiceType & SERVICE_DRIVER) { @@ -1611,6 +1649,14 @@ if (dwError != ERROR_SUCCESS) goto done; + } + else + { + if (dwStartType == SERVICE_BOOT_START || + dwStartType == SERVICE_SYSTEM_START) + { + return ERROR_INVALID_PARAMETER; + } } /* Allocate a new service entry */ @@ -1760,6 +1806,19 @@ dwError = ScmWriteDependencies(hServiceKey, (LPWSTR)lpDependencies, dwDependSize); + if (dwError != ERROR_SUCCESS) + goto done; + } + + /* If a non driver and NULL for lpServiceName, write ObjectName as LocalSystem */ + if ((dwServiceType & SERVICE_WIN32) && (!lpServiceName)) + { + dwError = RegSetValueExW(hServiceKey, + L"ObjectName", + 0, + REG_SZ, + (LPBYTE)L"LocalSystem", + 24); if (dwError != ERROR_SUCCESS) goto done; } @@ -2033,19 +2092,16 @@ ((wcslen(CurrentService->lpServiceName) + 1) * sizeof(WCHAR)) + ((wcslen(CurrentService->lpDisplayName) + 1) * sizeof(WCHAR)); - if (dwRequiredSize + dwSize <= dwBufSize) - { - DPRINT("Service name: %S fit\n", CurrentService->lpServiceName); - dwRequiredSize += dwSize; - dwServiceCount++; - dwLastResumeCount = CurrentService->dwResumeCount; - } - else + if (dwRequiredSize + dwSize > dwBufSize) { DPRINT("Service name: %S no fit\n", CurrentService->lpServiceName); break; } + DPRINT("Service name: %S fit\n", CurrentService->lpServiceName); + dwRequiredSize += dwSize; + dwServiceCount++; + dwLastResumeCount = CurrentService->dwResumeCount; } DPRINT("dwRequiredSize: %lu\n", dwRequiredSize); @@ -2109,33 +2165,26 @@ ((wcslen(CurrentService->lpServiceName) + 1) * sizeof(WCHAR)) + ((wcslen(CurrentService->lpDisplayName) + 1) * sizeof(WCHAR)); - if (dwRequiredSize + dwSize <= dwBufSize) - { - /* Copy the service name */ - wcscpy(lpStringPtr, - CurrentService->lpServiceName); - lpStatusPtr->lpServiceName = (LPWSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); - lpStringPtr += (wcslen(CurrentService->lpServiceName) + 1); - - /* Copy the display name */ - wcscpy(lpStringPtr, - CurrentService->lpDisplayName); - lpStatusPtr->lpDisplayName = (LPWSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); - lpStringPtr += (wcslen(CurrentService->lpDisplayName) + 1); - - /* Copy the status information */ - memcpy(&lpStatusPtr->ServiceStatus, - &CurrentService->Status, - sizeof(SERVICE_STATUS)); - - lpStatusPtr++; - dwRequiredSize += dwSize; - } - else - { + if (dwRequiredSize + dwSize > dwBufSize) break; - } - + + /* Copy the service name */ + wcscpy(lpStringPtr, CurrentService->lpServiceName); + lpStatusPtr->lpServiceName = (LPWSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); + lpStringPtr += (wcslen(CurrentService->lpServiceName) + 1); + + /* Copy the display name */ + wcscpy(lpStringPtr, CurrentService->lpDisplayName); + lpStatusPtr->lpDisplayName = (LPWSTR)((ULONG_PTR)lpStringPtr - (ULONG_PTR)lpBuffer); + lpStringPtr += (wcslen(CurrentService->lpDisplayName) + 1); + + /* Copy the status information */ + memcpy(&lpStatusPtr->ServiceStatus, + &CurrentService->Status, + sizeof(SERVICE_STATUS)); + + lpStatusPtr++; + dwRequiredSize += dwSize; } Done:;
16 years, 3 months
1
0
0
0
[pschweitzer] 35754: In FsRtlInsertPerStreamContext, FsRtlLookupPerStreamContextInternal, FsRtlRemovePerStreamContext: removed not needed assertion and return normally when PFSRTL_ADVANCED_FCB_HEADER pointer is null
by pschweitzer@svn.reactos.org
Author: pschweitzer Date: Fri Aug 29 07:48:59 2008 New Revision: 35754 URL:
http://svn.reactos.org/svn/reactos?rev=35754&view=rev
Log: In FsRtlInsertPerStreamContext, FsRtlLookupPerStreamContextInternal, FsRtlRemovePerStreamContext: removed not needed assertion and return normally when PFSRTL_ADVANCED_FCB_HEADER pointer is null Modified: branches/pierre-fsd/ntoskrnl/fsrtl/filtrctx.c Modified: branches/pierre-fsd/ntoskrnl/fsrtl/filtrctx.c URL:
http://svn.reactos.org/svn/reactos/branches/pierre-fsd/ntoskrnl/fsrtl/filtr…
============================================================================== --- branches/pierre-fsd/ntoskrnl/fsrtl/filtrctx.c [iso-8859-1] (original) +++ branches/pierre-fsd/ntoskrnl/fsrtl/filtrctx.c [iso-8859-1] Fri Aug 29 07:48:59 2008 @@ -48,9 +48,7 @@ PLIST_ENTRY NextEntry; PFSRTL_PER_STREAM_CONTEXT TmpPerStreamContext, PerStreamContext = NULL; - ASSERT(StreamContext); - - if (!(StreamContext->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) + if (!(StreamContext) || !(StreamContext->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) { return NULL; } @@ -108,9 +106,7 @@ FsRtlInsertPerStreamContext(IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, IN PFSRTL_PER_STREAM_CONTEXT Ptr) { - ASSERT(PerStreamContext); - - if (!(PerStreamContext->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) + if (!(PerStreamContext) || !(PerStreamContext->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) { return STATUS_INVALID_DEVICE_REQUEST; } @@ -133,9 +129,7 @@ PLIST_ENTRY NextEntry; PFSRTL_PER_STREAM_CONTEXT TmpPerStreamContext, PerStreamContext = NULL; - ASSERT(StreamContext); - - if (!(StreamContext->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) + if (!(StreamContext) || !(StreamContext->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) { return NULL; }
16 years, 3 months
1
0
0
0
[ekohl] 35753: Implement REnumDependentServicesA/W. Patch is based on bug report #3669 by bugboy <martinmnet@hotmail.com>
by ekohl@svn.reactos.org
Author: ekohl Date: Fri Aug 29 06:56:39 2008 New Revision: 35753 URL:
http://svn.reactos.org/svn/reactos?rev=35753&view=rev
Log: Implement REnumDependentServicesA/W. Patch is based on bug report #3669 by bugboy <martinmnet(a)hotmail.com> Modified: trunk/reactos/base/system/services/rpcserver.c Modified: trunk/reactos/base/system/services/rpcserver.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcse…
============================================================================== --- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Fri Aug 29 06:56:39 2008 @@ -243,6 +243,159 @@ DPRINT("Assigning new tag to service %S\n", lpService->lpServiceName); lpService->dwTag = 0; return ERROR_SUCCESS; +} + + +/* Internal recursive function */ +/* Need to search for every dependency on every service */ +static DWORD +Int_EnumDependentServicesW(HKEY hServicesKey, + PSERVICE lpService, + DWORD dwServiceState, + PSERVICE *lpServices, + LPDWORD pcbBytesNeeded, + LPDWORD lpServicesReturned) +{ + DWORD dwError = ERROR_SUCCESS; + WCHAR szNameBuf[MAX_PATH]; + WCHAR szValueBuf[MAX_PATH]; + WCHAR *lpszNameBuf = szNameBuf; + WCHAR *lpszValueBuf = szValueBuf; + DWORD dwSize; + DWORD dwNumSubKeys; + DWORD dwIteration; + PSERVICE lpCurrentService; + HKEY hServiceEnumKey; + DWORD dwCurrentServiceState = SERVICE_ACTIVE; + DWORD dwDependServiceStrPtr = 0; + DWORD dwRequiredSize = 0; + + /* Get the number of service keys */ + dwError = RegQueryInfoKeyW(hServicesKey, + NULL, + NULL, + NULL, + &dwNumSubKeys, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL); + if (dwError != ERROR_SUCCESS) + { + DPRINT1("ERROR! Unable to get number of services keys.\n"); + return dwError; + } + + /* Iterate the service keys to see if another service depends on the this service */ + for (dwIteration = 0; dwIteration < dwNumSubKeys; dwIteration++) + { + dwSize = MAX_PATH; + dwError = RegEnumKeyExW(hServicesKey, + dwIteration, + lpszNameBuf, + &dwSize, + NULL, + NULL, + NULL, + NULL); + if (dwError != ERROR_SUCCESS) + return dwError; + + /* Open the Service key */ + dwError = RegOpenKeyExW(hServicesKey, + lpszNameBuf, + 0, + KEY_READ, + &hServiceEnumKey); + if (dwError != ERROR_SUCCESS) + return dwError; + + dwSize = MAX_PATH; + + /* Check for the DependOnService Value */ + dwError = RegQueryValueExW(hServiceEnumKey, + L"DependOnService", + NULL, + NULL, + (LPBYTE)lpszValueBuf, + &dwSize); + + /* FIXME: Handle load order. */ + + /* If the service found has a DependOnService value */ + if (dwError == ERROR_SUCCESS) + { + dwDependServiceStrPtr = 0; + + /* Can be more than one Dependencies in the DependOnService string */ + while (wcslen(lpszValueBuf + dwDependServiceStrPtr) > 0) + { + if (wcsicmp(lpszValueBuf + dwDependServiceStrPtr, lpService->lpServiceName) == 0) + { + /* Get the current enumed service pointer */ + lpCurrentService = ScmGetServiceEntryByName(lpszNameBuf); + + /* Check for valid Service */ + if (!lpCurrentService) + { + /* This should never happen! */ + DPRINT1("This should not happen at this point, report to Developer\n"); + return ERROR_NOT_FOUND; + } + + /* Determine state the service is in */ + if (lpCurrentService->Status.dwCurrentState == SERVICE_STOPPED) + dwCurrentServiceState = SERVICE_INACTIVE; + + /* If the ServiceState matches that requested or searching for SERVICE_STATE_ALL */ + if ((dwCurrentServiceState == dwServiceState) || + (dwServiceState == SERVICE_STATE_ALL)) + { + /* Calculate the required size */ + dwRequiredSize += sizeof(SERVICE_STATUS); + dwRequiredSize += ((wcslen(lpCurrentService->lpServiceName) + 1) * sizeof(WCHAR)); + dwRequiredSize += ((wcslen(lpCurrentService->lpDisplayName) + 1) * sizeof(WCHAR)); + + /* Add the size for service name and display name pointers */ + dwRequiredSize += (2 * sizeof(PVOID)); + + /* increase the BytesNeeded size */ + *pcbBytesNeeded = *pcbBytesNeeded + dwRequiredSize; + + /* Don't fill callers buffer yet, as MSDN read that the last service with dependency + comes first */ + + /* Recursive call to check for its dependencies */ + Int_EnumDependentServicesW(hServicesKey, + lpCurrentService, + dwServiceState, + lpServices, + pcbBytesNeeded, + lpServicesReturned); + + /* If the lpServices is valid set the service pointer */ + if (lpServices) + lpServices[*lpServicesReturned] = lpCurrentService; + + *lpServicesReturned = *lpServicesReturned + 1; + } + } + + dwDependServiceStrPtr += (wcslen(lpszValueBuf + dwDependServiceStrPtr) + 1); + } + } + else if (*pcbBytesNeeded) + { + dwError = ERROR_SUCCESS; + } + + RegCloseKey(hServiceEnumKey); + } + + return dwError; } @@ -1676,12 +1829,120 @@ LPBOUNDED_DWORD_256K lpServicesReturned) { DWORD dwError = ERROR_SUCCESS; - - UNIMPLEMENTED; + DWORD dwServicesReturned = 0; + DWORD dwServiceCount; + HKEY hServicesKey = NULL; + LPSC_RPC_HANDLE hSCObject; + PSERVICE_HANDLE hSvc; + PSERVICE lpService = NULL; + PSERVICE *lpServicesArray = NULL; + LPENUM_SERVICE_STATUSW lpServicesPtr = NULL; + LPWSTR lpStr; + *pcbBytesNeeded = 0; *lpServicesReturned = 0; - DPRINT1("REnumDependentServicesW() done (Error %lu)\n", dwError); + DPRINT("REnumDependentServicesW() called\n"); + + hSCObject = &hService; + hSvc = (PSERVICE_HANDLE) *hSCObject; + lpService = hSvc->ServiceEntry; + + /* Check access rights */ + if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, + SC_MANAGER_ENUMERATE_SERVICE)) + { + DPRINT1("Insufficient access rights! 0x%lx\n", + hSvc->Handle.DesiredAccess); + return ERROR_ACCESS_DENIED; + } + + /* Open the Services Reg key */ + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\\CurrentControlSet\\Services", + 0, + KEY_READ, + &hServicesKey); + if (dwError != ERROR_SUCCESS) + return dwError; + + /* First determine the bytes needed and get the number of dependent services */ + dwError = Int_EnumDependentServicesW(hServicesKey, + lpService, + dwServiceState, + NULL, + pcbBytesNeeded, + &dwServicesReturned); + if (dwError != ERROR_SUCCESS) + goto Done; + + /* If buffer size is less than the bytes needed or pointer is null */ + if ((!lpServices) || (cbBufSize < *pcbBytesNeeded)) + { + dwError = ERROR_MORE_DATA; + goto Done; + } + + /* Allocate memory for array of service pointers */ + lpServicesArray = HeapAlloc(GetProcessHeap(), + 0, + (dwServicesReturned + 1) * sizeof(PSERVICE)); + if (!lpServicesArray) + { + DPRINT1("Could not allocate a buffer!!\n"); + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto Done; + } + + dwServicesReturned = 0; + *pcbBytesNeeded = 0; + + dwError = Int_EnumDependentServicesW(hServicesKey, + lpService, + dwServiceState, + lpServicesArray, + pcbBytesNeeded, + &dwServicesReturned); + if (dwError != ERROR_SUCCESS) + { + goto Done; + } + + lpServicesPtr = (LPENUM_SERVICE_STATUSW) lpServices; + lpStr = (LPWSTR)(lpServices + (dwServicesReturned * sizeof(ENUM_SERVICE_STATUSW))); + + /* Copy EnumDepenedentService to Buffer */ + for (dwServiceCount = 0; dwServiceCount < dwServicesReturned; dwServiceCount++) + { + lpService = lpServicesArray[dwServiceCount]; + + /* Copy status info */ + memcpy(&lpServicesPtr->ServiceStatus, + &lpService->Status, + sizeof(SERVICE_STATUS)); + + /* Copy display name */ + wcscpy(lpStr, lpService->lpDisplayName); + lpServicesPtr->lpDisplayName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServices); + lpStr += (wcslen(lpService->lpDisplayName) + 1); + + /* Copy service name */ + wcscpy(lpStr, lpService->lpServiceName); + lpServicesPtr->lpServiceName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServices); + lpStr += (wcslen(lpService->lpServiceName) + 1); + + lpServicesPtr ++; + } + + *lpServicesReturned = dwServicesReturned; + +Done: + if (lpServicesArray != NULL) + HeapFree(GetProcessHeap(), 0, lpServicesArray); + + RegCloseKey(hServicesKey); + + DPRINT("REnumDependentServicesW() done (Error %lu)\n", dwError); return dwError; } @@ -2722,10 +2983,141 @@ LPBOUNDED_DWORD_256K pcbBytesNeeded, LPBOUNDED_DWORD_256K lpServicesReturned) { - UNIMPLEMENTED; + DWORD dwError = ERROR_SUCCESS; + DWORD dwServicesReturned = 0; + DWORD dwServiceCount; + HKEY hServicesKey = NULL; + LPSC_RPC_HANDLE hSCObject; + PSERVICE_HANDLE hSvc; + PSERVICE lpService = NULL; + PSERVICE *lpServicesArray = NULL; + LPENUM_SERVICE_STATUSA lpServicesPtr = NULL; + LPSTR lpStr; + *pcbBytesNeeded = 0; *lpServicesReturned = 0; - return ERROR_CALL_NOT_IMPLEMENTED; + + DPRINT("REnumDependentServicesA() called\n"); + + hSCObject = &hService; + hSvc = (PSERVICE_HANDLE) *hSCObject; + lpService = hSvc->ServiceEntry; + + /* Check access rights */ + if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, + SC_MANAGER_ENUMERATE_SERVICE)) + { + DPRINT1("Insufficient access rights! 0x%lx\n", + hSvc->Handle.DesiredAccess); + return ERROR_ACCESS_DENIED; + } + + /* Open the Services Reg key */ + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\\CurrentControlSet\\Services", + 0, + KEY_READ, + &hServicesKey); + + if (dwError != ERROR_SUCCESS) return dwError; + + /* NOTE: Windows calculates the pcbBytesNeeded based on WCHAR strings for + both EnumDependentServicesA and EnumDependentServicesW. So returned pcbBytesNeeded + are the same for both. Verified in WINXP. */ + + /* First determine the bytes needed and get the number of dependent services*/ + dwError = Int_EnumDependentServicesW(hServicesKey, + lpService, + dwServiceState, + NULL, + pcbBytesNeeded, + &dwServicesReturned); + if (dwError != ERROR_SUCCESS) + goto Done; + + /* If buffer size is less than the bytes needed or pointer is null*/ + if ((!lpServices) || (cbBufSize < *pcbBytesNeeded)) + { + dwError = ERROR_MORE_DATA; + goto Done; + } + + /* Allocate memory for array of service pointers */ + lpServicesArray = HeapAlloc(GetProcessHeap(), + 0, + (dwServicesReturned + 1) * sizeof(PSERVICE)); + if (!lpServicesArray) + { + DPRINT1("Could not allocate a buffer!!\n"); + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto Done; + } + + dwServicesReturned = 0; + *pcbBytesNeeded = 0; + + dwError = Int_EnumDependentServicesW(hServicesKey, + lpService, + dwServiceState, + lpServicesArray, + pcbBytesNeeded, + &dwServicesReturned); + if (dwError != ERROR_SUCCESS) + { + goto Done; + } + + lpServicesPtr = (LPENUM_SERVICE_STATUSA)lpServices; + lpStr = (LPSTR)(lpServices + (dwServicesReturned * sizeof(ENUM_SERVICE_STATUSA))); + + /* Copy EnumDepenedentService to Buffer */ + for (dwServiceCount = 0; dwServiceCount < dwServicesReturned; dwServiceCount++) + { + lpService = lpServicesArray[dwServiceCount]; + + /* Copy the status info */ + memcpy(&lpServicesPtr->ServiceStatus, + &lpService->Status, + sizeof(SERVICE_STATUS)); + + /* Copy display name */ + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpDisplayName, + -1, + lpStr, + wcslen(lpService->lpDisplayName), + 0, + 0); + lpServicesPtr->lpDisplayName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServices); + lpStr += strlen(lpStr) + 1; + + /* Copy service name */ + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpServiceName, + -1, + lpStr, + wcslen(lpService->lpServiceName), + 0, + 0); + lpServicesPtr->lpServiceName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServices); + lpStr += strlen(lpStr) + 1; + + lpServicesPtr ++; + } + + *lpServicesReturned = dwServicesReturned; + +Done: + if (lpServicesArray) + HeapFree(GetProcessHeap(), 0, lpServicesArray); + + RegCloseKey(hServicesKey); + + DPRINT("REnumDependentServicesA() done (Error %lu)\n", dwError); + + return dwError; }
16 years, 3 months
1
0
0
0
[ekohl] 35752: - QueryServiceConfig2A/W: Fail if lpBuffer is NULL but cbBufSize is not 0. - RChangeServiceConfigW: Update the display name if it has been changed. - RQueryServiceConfigW: Return pointers to empty strings instead of NULL pointers if information is not available. - RQueryServiceConfig2W: Fail if lpBuffer is NULL. - Implement RChangeServiceConfigA, RQueryServiceConfigA and RQueryServiceConfig2A. Patch is based on bug report #3669 by bugboy <marinmnet@hotmail.com>.
by ekohl@svn.reactos.org
Author: ekohl Date: Fri Aug 29 06:15:53 2008 New Revision: 35752 URL:
http://svn.reactos.org/svn/reactos?rev=35752&view=rev
Log: - QueryServiceConfig2A/W: Fail if lpBuffer is NULL but cbBufSize is not 0. - RChangeServiceConfigW: Update the display name if it has been changed. - RQueryServiceConfigW: Return pointers to empty strings instead of NULL pointers if information is not available. - RQueryServiceConfig2W: Fail if lpBuffer is NULL. - Implement RChangeServiceConfigA, RQueryServiceConfigA and RQueryServiceConfig2A. Patch is based on bug report #3669 by bugboy <marinmnet(a)hotmail.com>. Modified: trunk/reactos/base/system/services/rpcserver.c trunk/reactos/dll/win32/advapi32/service/scm.c Modified: trunk/reactos/base/system/services/rpcserver.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcse…
============================================================================== --- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Fri Aug 29 06:15:53 2008 @@ -801,6 +801,7 @@ PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; HKEY hServiceKey = NULL; + LPWSTR lpDisplayNameW = NULL; DPRINT("RChangeServiceConfigW() called\n"); DPRINT("dwServiceType = %lu\n", dwServiceType); @@ -860,7 +861,21 @@ REG_SZ, (LPBYTE)lpDisplayName, (wcslen(lpDisplayName) + 1) * sizeof(WCHAR)); - /* FIXME: update lpService->lpDisplayName */ + + /* Update the display name */ + lpDisplayNameW = (LPWSTR)HeapAlloc(GetProcessHeap(), + 0, + (wcslen(lpDisplayName) + 1) * sizeof(WCHAR)); + if (lpDisplayNameW == NULL) + { + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto done; + } + + if (lpService->lpDisplayName != lpService->lpServiceName) + HeapFree(GetProcessHeap(), 0, lpService->lpDisplayName); + + lpService->lpDisplayName = lpDisplayNameW; } if (dwServiceType != SERVICE_NO_CHANGE) @@ -2011,7 +2026,8 @@ LPWSTR lpImagePath = NULL; LPWSTR lpServiceStartName = NULL; DWORD dwRequiredSize; - LPQUERY_SERVICE_CONFIGW lpConfig; + LPQUERY_SERVICE_CONFIGW lpConfig = NULL; + WCHAR lpEmptyString[] = {0,0}; LPWSTR lpStr; DPRINT("RQueryServiceConfigW() called\n"); @@ -2062,17 +2078,25 @@ if (lpImagePath != NULL) dwRequiredSize += ((wcslen(lpImagePath) + 1) * sizeof(WCHAR)); + else + dwRequiredSize += 2 * sizeof(WCHAR); if (lpService->lpGroup != NULL) dwRequiredSize += ((wcslen(lpService->lpGroup->lpGroupName) + 1) * sizeof(WCHAR)); + else + dwRequiredSize += 2 * sizeof(WCHAR); /* FIXME: Add Dependencies length*/ if (lpServiceStartName != NULL) dwRequiredSize += ((wcslen(lpServiceStartName) + 1) * sizeof(WCHAR)); + else + dwRequiredSize += 2 * sizeof(WCHAR); if (lpService->lpDisplayName != NULL) dwRequiredSize += ((wcslen(lpService->lpDisplayName) + 1) * sizeof(WCHAR)); + else + dwRequiredSize += 2 * sizeof(WCHAR); if (lpServiceConfig == NULL || cbBufSize < dwRequiredSize) { @@ -2091,48 +2115,55 @@ if (lpImagePath != NULL) { wcscpy(lpStr, lpImagePath); - lpConfig->lpBinaryPathName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); - lpStr += (wcslen(lpImagePath) + 1); } else { - lpConfig->lpBinaryPathName = NULL; - } + wcscpy(lpStr, lpEmptyString); + } + + lpConfig->lpBinaryPathName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (wcslen(lpStr) + 1); if (lpService->lpGroup != NULL) { wcscpy(lpStr, lpService->lpGroup->lpGroupName); - lpConfig->lpLoadOrderGroup = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); - lpStr += (wcslen(lpService->lpGroup->lpGroupName) + 1); } else { - lpConfig->lpLoadOrderGroup = NULL; - } + wcscpy(lpStr, lpEmptyString); + } + + lpConfig->lpLoadOrderGroup = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (wcslen(lpStr) + 1); /* FIXME: Append Dependencies */ - lpConfig->lpDependencies = NULL; + wcscpy(lpStr, lpEmptyString); + + lpStr += (wcslen(lpStr) + 1); + lpConfig->lpDependencies = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); if (lpServiceStartName != NULL) { wcscpy(lpStr, lpServiceStartName); - lpConfig->lpServiceStartName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); - lpStr += (wcslen(lpServiceStartName) + 1); } else { - lpConfig->lpServiceStartName = NULL; - } + wcscpy(lpStr, lpEmptyString); + } + + lpConfig->lpServiceStartName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (wcslen(lpStr) + 1); if (lpService->lpDisplayName != NULL) { wcscpy(lpStr, lpService->lpDisplayName); - lpConfig->lpDisplayName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); } else { - lpConfig->lpDisplayName = NULL; - } + wcscpy(lpStr, lpEmptyString); + } + + lpConfig->lpDisplayName = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); } if (pcbBytesNeeded != NULL) @@ -2388,8 +2419,271 @@ DWORD dwPwSize, LPSTR lpDisplayName) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; + DWORD dwError = ERROR_SUCCESS; + PSERVICE_HANDLE hSvc; + PSERVICE lpService = NULL; + HKEY hServiceKey = NULL; + LPWSTR lpDisplayNameW = NULL; + // LPWSTR lpBinaryPathNameW = NULL; + LPWSTR lpLoadOrderGroupW = NULL; + LPWSTR lpDependenciesW = NULL; + // LPWSTR lpPasswordW = NULL; + + DPRINT("RChangeServiceConfigA() called\n"); + DPRINT("dwServiceType = %lu\n", dwServiceType); + DPRINT("dwStartType = %lu\n", dwStartType); + DPRINT("dwErrorControl = %lu\n", dwErrorControl); + DPRINT("lpBinaryPathName = %s\n", lpBinaryPathName); + DPRINT("lpLoadOrderGroup = %s\n", lpLoadOrderGroup); + DPRINT("lpDisplayName = %s\n", lpDisplayName); + + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + hSvc = (PSERVICE_HANDLE)hService; + if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + { + DPRINT1("Invalid handle tag!\n"); + return ERROR_INVALID_HANDLE; + } + + if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, + SERVICE_CHANGE_CONFIG)) + { + DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + return ERROR_ACCESS_DENIED; + } + + lpService = hSvc->ServiceEntry; + if (lpService == NULL) + { + DPRINT1("lpService == NULL!\n"); + return ERROR_INVALID_HANDLE; + } + + /* FIXME: Lock database exclusively */ + + if (lpService->bDeleted) + { + /* FIXME: Unlock database */ + DPRINT1("The service has already been marked for delete!\n"); + return ERROR_SERVICE_MARKED_FOR_DELETE; + } + + /* Open the service key */ + dwError = ScmOpenServiceKey(lpService->szServiceName, + KEY_SET_VALUE, + &hServiceKey); + if (dwError != ERROR_SUCCESS) + goto done; + + /* Write service data to the registry */ + + if (lpDisplayName != NULL && *lpDisplayName != 0) + { + /* Set the display name */ + lpDisplayNameW = HeapAlloc(GetProcessHeap(), + 0, + (strlen(lpDisplayName) + 1) * sizeof(WCHAR)); + if (lpDisplayNameW == NULL) + { + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto done; + } + + MultiByteToWideChar(CP_ACP, + 0, + lpDisplayName, + -1, + lpDisplayNameW, + (wcslen(lpDisplayNameW) + 1) * sizeof(WCHAR)); + + RegSetValueExW(hServiceKey, + L"DisplayName", + 0, + REG_SZ, + (LPBYTE)lpDisplayNameW, + (wcslen(lpDisplayNameW) + 1) * sizeof(WCHAR)); + + /* Update lpService->lpDisplayName */ + if (lpService->lpDisplayName) + HeapFree(GetProcessHeap(), 0, lpService->lpDisplayName); + + lpService->lpDisplayName = lpDisplayNameW; + } + + if (dwServiceType != SERVICE_NO_CHANGE) + { + /* Set the service type */ + dwError = RegSetValueExW(hServiceKey, + L"Type", + 0, + REG_DWORD, + (LPBYTE)&dwServiceType, + sizeof(DWORD)); + if (dwError != ERROR_SUCCESS) + goto done; + + lpService->Status.dwServiceType = dwServiceType; + } + + if (dwStartType != SERVICE_NO_CHANGE) + { + /* Set the start value */ + dwError = RegSetValueExW(hServiceKey, + L"Start", + 0, + REG_DWORD, + (LPBYTE)&dwStartType, + sizeof(DWORD)); + if (dwError != ERROR_SUCCESS) + goto done; + + lpService->dwStartType = dwStartType; + } + + if (dwErrorControl != SERVICE_NO_CHANGE) + { + /* Set the error control value */ + dwError = RegSetValueExW(hServiceKey, + L"ErrorControl", + 0, + REG_DWORD, + (LPBYTE)&dwErrorControl, + sizeof(DWORD)); + if (dwError != ERROR_SUCCESS) + goto done; + + lpService->dwErrorControl = dwErrorControl; + } + +#if 0 + /* FIXME: set the new ImagePath value */ + + /* Set the image path */ + if (dwServiceType & SERVICE_WIN32) + { + if (lpBinaryPathName != NULL && *lpBinaryPathName != 0) + { + lpBinaryPathNameW=HeapAlloc(GetProcessHeap(),0, (strlen(lpBinaryPathName)+1) * sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, lpBinaryPathName, -1, lpBinaryPathNameW, (wcslen(lpBinaryPathNameW)+1) * sizeof(WCHAR)); + dwError = RegSetValueExW(hServiceKey, + L"ImagePath", + 0, + REG_EXPAND_SZ, + (LPBYTE)lpBinaryPathNameW, + (wcslen(lpBinaryPathNameW) + 1) * sizeof(WCHAR)); + if (dwError != ERROR_SUCCESS) + goto done; + } + } + else if (dwServiceType & SERVICE_DRIVER) + { + if (lpImagePath != NULL && *lpImagePath != 0) + { + dwError = RegSetValueExW(hServiceKey, + L"ImagePath", + 0, + REG_EXPAND_SZ, + (LPBYTE)lpImagePath, + (wcslen(lpImagePath) + 1) *sizeof(WCHAR)); + if (dwError != ERROR_SUCCESS) + goto done; + } + } +#endif + + /* Set the group name */ + if (lpLoadOrderGroup != NULL && *lpLoadOrderGroup != 0) + { + lpLoadOrderGroupW = HeapAlloc(GetProcessHeap(), + 0, + (strlen(lpLoadOrderGroup)+1) * sizeof(WCHAR)); + if (lpLoadOrderGroupW == NULL) + { + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto done; + } + + MultiByteToWideChar(CP_ACP, + 0, + lpLoadOrderGroup, + -1, + lpLoadOrderGroupW, + (wcslen(lpLoadOrderGroupW) + 1) * sizeof(WCHAR)); + + dwError = RegSetValueExW(hServiceKey, + L"Group", + 0, + REG_SZ, + (LPBYTE)lpLoadOrderGroupW, + (wcslen(lpLoadOrderGroupW) + 1) * sizeof(WCHAR)); + if (dwError != ERROR_SUCCESS) + goto done; + + /* FIXME: Update lpService->lpServiceGroup */ + + HeapFree(GetProcessHeap(), 0, lpLoadOrderGroupW); + } + + if (lpdwTagId != NULL) + { + dwError = ScmAssignNewTag(lpService); + if (dwError != ERROR_SUCCESS) + goto done; + + dwError = RegSetValueExW(hServiceKey, + L"Tag", + 0, + REG_DWORD, + (LPBYTE)&lpService->dwTag, + sizeof(DWORD)); + if (dwError != ERROR_SUCCESS) + goto done; + + *lpdwTagId = lpService->dwTag; + } + + /* Write dependencies */ + if (lpDependencies != NULL && *lpDependencies != 0) + { + lpDependenciesW = HeapAlloc(GetProcessHeap(), + 0, + (strlen(lpDependencies)+1) * sizeof(WCHAR)); + if (lpDependenciesW == NULL) + { + dwError = ERROR_NOT_ENOUGH_MEMORY; + goto done; + } + + MultiByteToWideChar(CP_ACP, + 0, + lpDependencies, + dwDependSize, + lpDependenciesW, + (wcslen(lpDependenciesW)+1) * sizeof(WCHAR)); + + dwError = ScmWriteDependencies(hServiceKey, + (LPWSTR)lpDependenciesW, + dwDependSize); + + HeapFree(GetProcessHeap(), 0, lpDependenciesW); + } + + if (lpPassword != NULL) + { + /* FIXME: Write password */ + } + + /* FIXME: Unlock database */ + +done: + if (hServiceKey != NULL) + RegCloseKey(hServiceKey); + + DPRINT("RChangeServiceConfigA() done (Error %lu)\n", dwError); + + return dwError; } @@ -2528,8 +2822,204 @@ DWORD cbBufSize, LPBOUNDED_DWORD_8K pcbBytesNeeded) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; + LPQUERY_SERVICE_CONFIGA lpServiceConfig = (LPQUERY_SERVICE_CONFIGA)lpBuf; + DWORD dwError = ERROR_SUCCESS; + PSERVICE_HANDLE hSvc; + PSERVICE lpService = NULL; + HKEY hServiceKey = NULL; + LPWSTR lpImagePath = NULL; + LPWSTR lpServiceStartName = NULL; + DWORD dwRequiredSize; + LPQUERY_SERVICE_CONFIGA lpConfig = NULL; + CHAR lpEmptyString[]={0,0}; + LPSTR lpStr; + + DPRINT("RQueryServiceConfigA() called\n"); + + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + hSvc = (PSERVICE_HANDLE)hService; + if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + { + DPRINT1("Invalid handle tag!\n"); + return ERROR_INVALID_HANDLE; + } + + if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, + SERVICE_QUERY_CONFIG)) + { + DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + return ERROR_ACCESS_DENIED; + } + + lpService = hSvc->ServiceEntry; + if (lpService == NULL) + { + DPRINT1("lpService == NULL!\n"); + return ERROR_INVALID_HANDLE; + } + + /* FIXME: Lock the service database shared */ + + dwError = ScmOpenServiceKey(lpService->lpServiceName, + KEY_READ, + &hServiceKey); + if (dwError != ERROR_SUCCESS) + goto Done; + + dwError = ScmReadString(hServiceKey, + L"ImagePath", + &lpImagePath); + if (dwError != ERROR_SUCCESS) + goto Done; + + ScmReadString(hServiceKey, + L"ObjectName", + &lpServiceStartName); + + dwRequiredSize = sizeof(QUERY_SERVICE_CONFIGW); + + if (lpImagePath != NULL) + dwRequiredSize += wcslen(lpImagePath) + 1; + else + dwRequiredSize += 2; + + if (lpService->lpGroup != NULL) + dwRequiredSize += wcslen(lpService->lpGroup->lpGroupName) + 1; + else + dwRequiredSize += 2; + + /* FIXME: Add Dependencies length*/ + dwRequiredSize += 2; + + if (lpServiceStartName != NULL) + dwRequiredSize += wcslen(lpServiceStartName) + 1; + else + dwRequiredSize += 2; + + if (lpService->lpDisplayName != NULL) + dwRequiredSize += wcslen(lpService->lpDisplayName) + 1; + else + dwRequiredSize += 2; + + if (lpServiceConfig == NULL || cbBufSize < dwRequiredSize) + { + dwError = ERROR_INSUFFICIENT_BUFFER; + } + else + { + lpConfig = (LPQUERY_SERVICE_CONFIGA)lpServiceConfig; + lpConfig->dwServiceType = lpService->Status.dwServiceType; + lpConfig->dwStartType = lpService->dwStartType; + lpConfig->dwErrorControl = lpService->dwErrorControl; + lpConfig->dwTagId = lpService->dwTag; + + lpStr = (LPSTR)(lpServiceConfig + 1); + + /* NOTE: Strings that are NULL for QUERY_SERVICE_CONFIG are pointers to empty strings. + Verified in WINXP*/ + + if (lpImagePath) + { + WideCharToMultiByte(CP_ACP, + 0, + lpImagePath, + -1, + lpStr, + wcslen(lpImagePath), + 0, + 0); + } + else + { + strcpy(lpStr, lpEmptyString); + } + + lpConfig->lpBinaryPathName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (strlen((LPSTR)lpStr) + 1); + + if (lpService->lpGroup) + { + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpGroup->lpGroupName, + -1, + lpStr, + wcslen(lpService->lpGroup->lpGroupName), + 0, + 0); + } + else + { + strcpy(lpStr, lpEmptyString); + } + + lpConfig->lpLoadOrderGroup = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (strlen(lpStr) + 1); + + /* FIXME: Append Dependencies */ + strcpy(lpStr, lpEmptyString); + + lpConfig->lpDependencies = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (strlen(lpStr) + 1); + + if (lpServiceStartName) + { + WideCharToMultiByte(CP_ACP, + 0, + lpServiceStartName, + -1, + lpStr, + wcslen(lpServiceStartName), + 0, + 0); + } + else + { + strcpy(lpStr, lpEmptyString); + } + + lpConfig->lpServiceStartName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + lpStr += (strlen(lpStr) + 1); + + if (lpService->lpDisplayName) + { + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpDisplayName, + -1, + lpStr, + wcslen(lpService->lpDisplayName), + 0, + 0); + } + else + { + strcpy(lpStr, lpEmptyString); + } + + lpConfig->lpDisplayName = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpConfig); + } + + if (pcbBytesNeeded != NULL) + *pcbBytesNeeded = dwRequiredSize; + +Done:; + if (lpImagePath != NULL) + HeapFree(GetProcessHeap(), 0, lpImagePath); + + if (lpServiceStartName != NULL) + HeapFree(GetProcessHeap(), 0, lpServiceStartName); + + if (hServiceKey != NULL) + RegCloseKey(hServiceKey); + + /* FIXME: Unlock the service database */ + + DPRINT("RQueryServiceConfigA() done\n"); + + return dwError; } @@ -2917,8 +3407,102 @@ DWORD cbBufSize, LPBOUNDED_DWORD_8K pcbBytesNeeded) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; + DWORD dwError = ERROR_SUCCESS; + PSERVICE_HANDLE hSvc; + PSERVICE lpService = NULL; + HKEY hServiceKey = NULL; + DWORD dwRequiredSize; + LPWSTR lpDescriptionW = NULL; + LPSTR lpDescription = NULL; + + DPRINT("RQueryServiceConfig2W() called\n"); + + if (!lpBuffer) + return ERROR_INVALID_ADDRESS; + + if (ScmShutdown) + return ERROR_SHUTDOWN_IN_PROGRESS; + + hSvc = (PSERVICE_HANDLE)hService; + if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) + { + DPRINT1("Invalid handle tag!\n"); + return ERROR_INVALID_HANDLE; + } + + if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, + SERVICE_QUERY_CONFIG)) + { + DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + return ERROR_ACCESS_DENIED; + } + + lpService = hSvc->ServiceEntry; + if (lpService == NULL) + { + DPRINT1("lpService == NULL!\n"); + return ERROR_INVALID_HANDLE; + } + + /* FIXME: Lock the service database shared */ + + dwError = ScmOpenServiceKey(lpService->lpServiceName, + KEY_READ, + &hServiceKey); + if (dwError != ERROR_SUCCESS) + goto done; + + if (dwInfoLevel & SERVICE_CONFIG_DESCRIPTION) + { + LPSERVICE_DESCRIPTIONA lpServiceDescription = (LPSERVICE_DESCRIPTIONA)lpBuffer; + LPSTR lpStr; + + dwError = ScmReadString(hServiceKey, + L"Description", + &lpDescriptionW); + if (dwError != ERROR_SUCCESS) + goto done; + + dwRequiredSize = sizeof(SERVICE_DESCRIPTIONA) + ((wcslen(lpDescriptionW) + 1)); + + if (cbBufSize < dwRequiredSize) + { + *pcbBytesNeeded = dwRequiredSize; + dwError = ERROR_INSUFFICIENT_BUFFER; + goto done; + } + + lpStr = (LPSTR)(lpServiceDescription + 1); + + WideCharToMultiByte(CP_ACP, + 0, + lpDescriptionW, + -1, + lpStr, + wcslen(lpDescriptionW), + NULL, + NULL); + lpServiceDescription->lpDescription = (LPSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceDescription); + } + else if (dwInfoLevel & SERVICE_CONFIG_FAILURE_ACTIONS) + { + UNIMPLEMENTED; + dwError = ERROR_CALL_NOT_IMPLEMENTED; + goto done; + } + +done: + if (lpDescription != NULL) + HeapFree(GetProcessHeap(), 0, lpDescription); + + if (hServiceKey != NULL) + RegCloseKey(hServiceKey); + + /* FIXME: Unlock database */ + + DPRINT("RQueryServiceConfig2W() done (Error %lu)\n", dwError); + + return dwError; } @@ -2940,6 +3524,9 @@ DPRINT("RQueryServiceConfig2W() called\n"); + if (!lpBuffer) + return ERROR_INVALID_ADDRESS; + if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; @@ -2991,12 +3578,10 @@ dwError = ERROR_INSUFFICIENT_BUFFER; goto done; } - else - { - lpStr = (LPWSTR)(lpServiceDescription + 1); - wcscpy(lpStr, lpDescription); - lpServiceDescription->lpDescription = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceDescription); - } + + lpStr = (LPWSTR)(lpServiceDescription + 1); + wcscpy(lpStr, lpDescription); + lpServiceDescription->lpDescription = (LPWSTR)((ULONG_PTR)lpStr - (ULONG_PTR)lpServiceDescription); } else if (dwInfoLevel & SERVICE_CONFIG_FAILURE_ACTIONS) { Modified: trunk/reactos/dll/win32/advapi32/service/scm.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service…
============================================================================== --- trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] Fri Aug 29 06:15:53 2008 @@ -1831,6 +1831,12 @@ TRACE("QueryServiceConfig2A(%p, %lu, %p, %lu, %p)\n", hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded); + if (lpBuffer == NULL && cbBufSize != 0) + { + SetLastError(ERROR_INVALID_ADDRESS); + return FALSE; + } + HandleBind(); _SEH_TRY @@ -1915,6 +1921,12 @@ TRACE("QueryServiceConfig2W(%p, %lu, %p, %lu, %p)\n", hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded); + if (lpBuffer == NULL && cbBufSize != 0) + { + SetLastError(ERROR_INVALID_ADDRESS); + return FALSE; + } + HandleBind(); _SEH_TRY
16 years, 3 months
1
0
0
0
[arty] 35751: Make CcPinRead and CcPreparePinWrite the same for now.
by arty@svn.reactos.org
Author: arty Date: Fri Aug 29 05:55:59 2008 New Revision: 35751 URL:
http://svn.reactos.org/svn/reactos?rev=35751&view=rev
Log: Make CcPinRead and CcPreparePinWrite the same for now. Modified: branches/arty-newcc/ntoskrnl/cache/pinsup.c Modified: branches/arty-newcc/ntoskrnl/cache/pinsup.c URL:
http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/pinsu…
============================================================================== --- branches/arty-newcc/ntoskrnl/cache/pinsup.c [iso-8859-1] (original) +++ branches/arty-newcc/ntoskrnl/cache/pinsup.c [iso-8859-1] Fri Aug 29 05:55:59 2008 @@ -670,23 +670,11 @@ OUT PVOID *Bcb, OUT PVOID *Buffer) { - BOOLEAN GotIt = CcPinMappedData - (FileObject, - FileOffset, - Length, - Flags, - Bcb); - - PNOCC_BCB TheBcb = (PNOCC_BCB)*Bcb; - ULONG Start = TheBcb - CcCacheSections; - - DPRINT("CcPreparePinWrite(#%x)\n", Start); - - if (GotIt) - { - CcCacheSections[Start].Dirty = TRUE; - *Buffer = (PVOID)((PCHAR)TheBcb->BaseAddress + (FileOffset->QuadPart - TheBcb->FileOffset.QuadPart)); - DPRINT("Returning Buffer: %x\n", *Buffer); + BOOLEAN Result = CcMapData(FileObject, FileOffset, Length, Flags, Bcb, Buffer); + + if (Result) + { + PNOCC_BCB TheBcb = (PNOCC_BCB)*Bcb; if (!TheBcb->Pinned) { TheBcb->Pinned = IoAllocateMdl @@ -695,12 +683,21 @@ FALSE, FALSE, NULL); - MmProbeAndLockPages(TheBcb->Pinned, KernelMode, IoReadAccess); - } - } - - DPRINT("Done\n"); - return GotIt; + _SEH_TRY + { + MmProbeAndLockPages(TheBcb->Pinned, KernelMode, IoReadAccess); + } + _SEH_HANDLE + { + IoFreeMdl(TheBcb->Pinned); + TheBcb->Pinned = NULL; + Result = FALSE; + } + _SEH_END; + } + } + + return Result; } VOID
16 years, 3 months
1
0
0
0
[ekohl] 35750: - ScmCreateManagerHandle: Fail on invalid database names. - ROpenServiceW: Fail if lpServiceName is NULL. - ROpenServiceA: Don't pass an empty string to ROpenServiceW if lpServiceName is NULL. Use NULL instead. This patch is based on bug report #3669 by bugboy <martinmnet@hotmail.com>.
by ekohl@svn.reactos.org
Author: ekohl Date: Fri Aug 29 05:34:23 2008 New Revision: 35750 URL:
http://svn.reactos.org/svn/reactos?rev=35750&view=rev
Log: - ScmCreateManagerHandle: Fail on invalid database names. - ROpenServiceW: Fail if lpServiceName is NULL. - ROpenServiceA: Don't pass an empty string to ROpenServiceW if lpServiceName is NULL. Use NULL instead. This patch is based on bug report #3669 by bugboy <martinmnet(a)hotmail.com>. Modified: trunk/reactos/base/system/services/rpcserver.c Modified: trunk/reactos/base/system/services/rpcserver.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcse…
============================================================================== --- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Fri Aug 29 05:34:23 2008 @@ -151,6 +151,17 @@ if (lpDatabaseName == NULL) lpDatabaseName = SERVICES_ACTIVE_DATABASEW; + + if (wcsicmp(lpDatabaseName,SERVICES_FAILED_DATABASEW)==0) + { + DPRINT1("Database %S, does not exist\n",lpDatabaseName); + return ERROR_DATABASE_DOES_NOT_EXIST; + } + else if (wcsicmp(lpDatabaseName, SERVICES_ACTIVE_DATABASEW) != 0) + { + DPRINT1("Invalid Database name %S.\n",lpDatabaseName); + return ERROR_INVALID_NAME; + } Ptr = (MANAGER_HANDLE*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, @@ -1936,6 +1947,9 @@ if (!lpServiceHandle) return ERROR_INVALID_PARAMETER; + if (!lpServiceName) + return ERROR_INVALID_ADDRESS; + hManager = (PMANAGER_HANDLE)hSCManager; if (!hManager || hManager->Handle.Tag != MANAGER_TAG) { @@ -2489,8 +2503,9 @@ DPRINT("ROpenServiceA() called\n"); - RtlCreateUnicodeStringFromAsciiz(&ServiceName, - lpServiceName); + if (lpServiceName) + RtlCreateUnicodeStringFromAsciiz(&ServiceName, + lpServiceName); dwError = ROpenServiceW(BindingHandle, hSCManager, @@ -2498,7 +2513,8 @@ dwDesiredAccess, lpServiceHandle); - RtlFreeUnicodeString(&ServiceName); + if (lpServiceName) + RtlFreeUnicodeString(&ServiceName); return dwError; }
16 years, 3 months
1
0
0
0
[arty] 35749: Remove page cleaning in section.c -- not needed. Page replacement will take care of it. Add refcount for SharedCacheMap ... it appears that CcInitializeCacheMap and CcUninitializeCacheMap are expected to be paired and refcounted.
by arty@svn.reactos.org
Author: arty Date: Fri Aug 29 05:24:38 2008 New Revision: 35749 URL:
http://svn.reactos.org/svn/reactos?rev=35749&view=rev
Log: Remove page cleaning in section.c -- not needed. Page replacement will take care of it. Add refcount for SharedCacheMap ... it appears that CcInitializeCacheMap and CcUninitializeCacheMap are expected to be paired and refcounted. Modified: branches/arty-newcc/ntoskrnl/cache/cachesub.c branches/arty-newcc/ntoskrnl/cache/fssup.c branches/arty-newcc/ntoskrnl/cache/pinsup.c branches/arty-newcc/ntoskrnl/include/internal/cc.h branches/arty-newcc/ntoskrnl/mm/section.c Modified: branches/arty-newcc/ntoskrnl/cache/cachesub.c URL:
http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/cache…
============================================================================== --- branches/arty-newcc/ntoskrnl/cache/cachesub.c [iso-8859-1] (original) +++ branches/arty-newcc/ntoskrnl/cache/cachesub.c [iso-8859-1] Fri Aug 29 05:24:38 2008 @@ -36,7 +36,9 @@ PDEVICE_OBJECT DeviceObject; PIO_STACK_LOCATION IrpSp; KIRQL OldIrql; - + PHYSICAL_ADDRESS Page; + + ASSERT(Length <= PAGE_SIZE); KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); if (MmIsDirtyPage(PsInitialSystemProcess, Buffer)) @@ -93,7 +95,9 @@ return Status; } } - + + Page = MmGetPhysicalAddress(Buffer); + MmSetCleanAllRmaps((PFN_TYPE)(Page.QuadPart >> PAGE_SHIFT)); ObDereferenceObject(FileObject); DPRINT("Paging IO Done: %08x\n", ReadStatus->Status); Modified: branches/arty-newcc/ntoskrnl/cache/fssup.c URL:
http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/fssup…
============================================================================== --- branches/arty-newcc/ntoskrnl/cache/fssup.c [iso-8859-1] (original) +++ branches/arty-newcc/ntoskrnl/cache/fssup.c [iso-8859-1] Fri Aug 29 05:24:38 2008 @@ -104,13 +104,25 @@ IN PVOID LazyWriteContext) { DPRINT("Initializing file object for %wZ\n", &FileObject->FileName); - PNOCC_CACHE_MAP Map = ExAllocatePool(NonPagedPool, sizeof(NOCC_CACHE_MAP)); - FileObject->SectionObjectPointer->SharedCacheMap = Map; - Map->FileObject = FileObject; - Map->NumberOfMaps = 0; - Map->FileSizes = *FileSizes; - DPRINT("FileSizes->ValidDataLength %x\n", FileSizes->ValidDataLength.LowPart); - InitializeListHead(&Map->AssociatedBcb); + CcpLock(); + if (FileObject->SectionObjectPointer->SharedCacheMap) + { + PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP)FileObject->SectionObjectPointer->SharedCacheMap; + InterlockedIncrement((PLONG)&Map->RefCount); + } + else + { + PNOCC_CACHE_MAP Map = ExAllocatePool(NonPagedPool, sizeof(NOCC_CACHE_MAP)); + FileObject->SectionObjectPointer->SharedCacheMap = Map; + Map->RefCount = 1; + Map->FileObject = FileObject; + Map->NumberOfMaps = 0; + Map->FileSizes = *FileSizes; + ASSERT(Map->FileSizes.ValidDataLength.HighPart != 0xcccccccc); + DPRINT("FileSizes->ValidDataLength %x\n", FileSizes->ValidDataLength.LowPart); + InitializeListHead(&Map->AssociatedBcb); + } + CcpUnlock(); } BOOLEAN @@ -124,10 +136,10 @@ PLIST_ENTRY Entry; IO_STATUS_BLOCK IOSB; - DPRINT("Uninitializing file object for %wZ\n", &FileObject->FileName); + DPRINT("Uninitializing file object for %wZ SectionObjectPointer %x\n", &FileObject->FileName, FileObject->SectionObjectPointer); ASSERT(UninitializeEvent == NULL); - + for (Entry = Map->AssociatedBcb.Flink; Entry != &Map->AssociatedBcb; Entry = Entry->Flink) @@ -148,25 +160,28 @@ } CcpLock(); - - for (Entry = Map->AssociatedBcb.Flink; - Entry != &Map->AssociatedBcb; - Entry = Entry->Flink) - { - Bcb = CONTAINING_RECORD(Entry, NOCC_BCB, ThisFileList); - if (Bcb->RefCount == 1) - { - DPRINT("Unmapping #%x\n", Bcb - CcCacheSections); - CcpDereferenceCache(Bcb - CcCacheSections); - } + + if (InterlockedDecrement((PLONG)&Map->RefCount) == 1) + { + for (Entry = Map->AssociatedBcb.Flink; + Entry != &Map->AssociatedBcb; + Entry = Entry->Flink) + { + Bcb = CONTAINING_RECORD(Entry, NOCC_BCB, ThisFileList); + if (Bcb->RefCount == 1) + { + DPRINT("Unmapping #%x\n", Bcb - CcCacheSections); + CcpDereferenceCache(Bcb - CcCacheSections); + } + } + + ExFreePool(Map); + + /* Clear the cache map */ + FileObject->SectionObjectPointer->SharedCacheMap = NULL; } CcpUnlock(); - - ExFreePool(Map); - - /* Clear the cache map */ - FileObject->SectionObjectPointer->SharedCacheMap = NULL; return TRUE; } @@ -200,7 +215,10 @@ IN BOOLEAN UninitializeCacheMaps) { IO_STATUS_BLOCK IOSB; + PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP)SectionObjectPointer->SharedCacheMap; CcFlushCache(SectionObjectPointer, FileOffset, Length, &IOSB); + if (UninitializeCacheMaps) + CcUninitializeCacheMap(Map->FileObject, NULL, NULL); return NT_SUCCESS(IOSB.Status); } Modified: branches/arty-newcc/ntoskrnl/cache/pinsup.c URL:
http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/pinsu…
============================================================================== --- branches/arty-newcc/ntoskrnl/cache/pinsup.c [iso-8859-1] (original) +++ branches/arty-newcc/ntoskrnl/cache/pinsup.c [iso-8859-1] Fri Aug 29 05:24:38 2008 @@ -455,10 +455,23 @@ if (!SectionObject) { PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP)FileObject->SectionObjectPointer->SharedCacheMap; - LONG SectionSize = min(CACHE_STRIPE, Map->FileSizes.ValidDataLength.QuadPart - Target.QuadPart); - ASSERT(SectionSize > 0 && SectionSize <= CACHE_STRIPE); + ULONG SectionSize; + + DPRINT("%08x: File size %x%x\n", FileObject->SectionObjectPointer, Map->FileSizes.ValidDataLength.HighPart, Map->FileSizes.ValidDataLength.LowPart); + + if (Map->FileSizes.ValidDataLength.QuadPart) + { + SectionSize = min(CACHE_STRIPE, Map->FileSizes.ValidDataLength.QuadPart - Target.QuadPart); + } + else + { + SectionSize = CACHE_STRIPE; + } + DPRINT("Allocating a cache stripe at %x:%d\n", Target.LowPart, SectionSize); + ASSERT(SectionSize <= CACHE_STRIPE); + Status = CcpAllocateSection (FileObject, SectionSize, Modified: branches/arty-newcc/ntoskrnl/include/internal/cc.h URL:
http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/include/int…
============================================================================== --- branches/arty-newcc/ntoskrnl/include/internal/cc.h [iso-8859-1] (original) +++ branches/arty-newcc/ntoskrnl/include/internal/cc.h [iso-8859-1] Fri Aug 29 05:24:38 2008 @@ -132,6 +132,7 @@ LIST_ENTRY AssociatedBcb; PFILE_OBJECT FileObject; ULONG NumberOfMaps; + ULONG RefCount; CC_FILE_SIZES FileSizes; } NOCC_CACHE_MAP, *PNOCC_CACHE_MAP; Modified: branches/arty-newcc/ntoskrnl/mm/section.c URL:
http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/mm/section.…
============================================================================== --- branches/arty-newcc/ntoskrnl/mm/section.c [iso-8859-1] (original) +++ branches/arty-newcc/ntoskrnl/mm/section.c [iso-8859-1] Fri Aug 29 05:24:38 2008 @@ -159,8 +159,6 @@ PIRP Irp = NULL; KEVENT ReadWait; PDEVICE_OBJECT DeviceObject = MmGetDeviceObjectForFile(FileObject); - PCHAR BufferWalk; - PHYSICAL_ADDRESS Page; PIO_STACK_LOCATION IrpSp; DPRINT1 @@ -220,13 +218,6 @@ ((PCHAR)Buffer)[2] & 0xff, ((PCHAR)Buffer)[3] & 0xff); - for (BufferWalk = (PCHAR)Buffer; BufferWalk < (PCHAR)Buffer + Length; BufferWalk += PAGE_SIZE) - { - Page = MmGetPhysicalAddress((PVOID)BufferWalk); - DPRINT("Setting page clean: %x\n", Page.u.LowPart); - //MmSetCleanAllRmaps((PFN_TYPE)(Page.QuadPart >> PAGE_SHIFT)); - } - return ReadStatus->Status; } @@ -243,8 +234,6 @@ PIRP Irp = NULL; KEVENT ReadWait; PDEVICE_OBJECT DeviceObject; - PCHAR BufferWalk; - PHYSICAL_ADDRESS Page; PIO_STACK_LOCATION IrpSp; ASSERT(FileObject); @@ -308,12 +297,6 @@ ObDereferenceObject(FileObject); DPRINT("Paging IO Done: %08x\n", ReadStatus->Status); - for (BufferWalk = (PCHAR)Buffer; BufferWalk < (PCHAR)Buffer + Length; BufferWalk += PAGE_SIZE) - { - Page = MmGetPhysicalAddress((PVOID)BufferWalk); - //MmSetCleanAllRmaps((PFN_TYPE)(Page.QuadPart >> PAGE_SHIFT)); - } - return ReadStatus->Status; }
16 years, 3 months
1
0
0
0
[ekohl] 35748: - GetServiceDisplayNameA/W and GetServiceKeyNameA/W: Fix returned name size. - RGetServiceDisplayNameW: Return the service name if the display name is not available. - Implement RGetServiceDisplayNameA and RGetServiceKeyNameA.
by ekohl@svn.reactos.org
Author: ekohl Date: Fri Aug 29 05:01:06 2008 New Revision: 35748 URL:
http://svn.reactos.org/svn/reactos?rev=35748&view=rev
Log: - GetServiceDisplayNameA/W and GetServiceKeyNameA/W: Fix returned name size. - RGetServiceDisplayNameW: Return the service name if the display name is not available. - Implement RGetServiceDisplayNameA and RGetServiceKeyNameA. Modified: trunk/reactos/base/system/services/rpcserver.c trunk/reactos/dll/win32/advapi32/service/scm.c Modified: trunk/reactos/base/system/services/rpcserver.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/services/rpcse…
============================================================================== --- trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] (original) +++ trunk/reactos/base/system/services/rpcserver.c [iso-8859-1] Fri Aug 29 05:01:06 2008 @@ -2241,15 +2241,37 @@ if (lpService == NULL) { DPRINT1("Could not find a service!\n"); + + /* If the service could not be found and lpcchBuffer is 0, windows + puts null in lpDisplayName and puts 1 in lpcchBuffer */ + if (*lpcchBuffer == 0) + { + *lpcchBuffer = 1; + *lpDisplayName = '\0'; + } + return ERROR_SERVICE_DOES_NOT_EXIST; } - dwLength = wcslen(lpService->lpDisplayName) + 1; - - if (lpDisplayName != NULL && - *lpcchBuffer >= dwLength) - { - wcscpy(lpDisplayName, lpService->lpDisplayName); + if (!lpService->lpDisplayName) + { + dwLength = wcslen(lpService->lpServiceName); + + if (lpServiceName != NULL && + *lpcchBuffer > dwLength) + { + wcscpy(lpDisplayName, lpService->lpServiceName); + } + } + else + { + dwLength = wcslen(lpService->lpDisplayName); + + if (lpDisplayName != NULL && + *lpcchBuffer > dwLength) + { + wcscpy(lpDisplayName, lpService->lpDisplayName); + } } dwError = (*lpcchBuffer > dwLength) ? ERROR_SUCCESS : ERROR_INSUFFICIENT_BUFFER; @@ -2291,20 +2313,31 @@ if (lpService == NULL) { DPRINT1("Could not find a service!\n"); + + /* If the service could not be found and lpcchBuffer is 0, windows + puts null in lpDisplayName and puts 2 in lpcchBuffer */ + if (*lpcchBuffer == 0) + { + *lpcchBuffer = 2; + *lpServiceName = '\0'; + } + return ERROR_SERVICE_DOES_NOT_EXIST; } - dwLength = wcslen(lpService->lpServiceName) + 1; + dwLength = wcslen(lpService->lpServiceName); if (lpServiceName != NULL && - *lpcchBuffer >= dwLength) + *lpcchBuffer > dwLength) { wcscpy(lpServiceName, lpService->lpServiceName); + *lpcchBuffer = dwLength; + return ERROR_SUCCESS; } dwError = (*lpcchBuffer > dwLength) ? ERROR_SUCCESS : ERROR_INSUFFICIENT_BUFFER; - *lpcchBuffer = dwLength; + *lpcchBuffer = dwLength * 2; return dwError; } @@ -2559,8 +2592,97 @@ LPSTR lpDisplayName, LPBOUNDED_DWORD_4K lpcchBuffer) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; +// PMANAGER_HANDLE hManager; + PSERVICE lpService; + DWORD dwLength; + DWORD dwError; + LPWSTR lpServiceNameW; + + DPRINT("RGetServiceDisplayNameA() called\n"); + DPRINT("hSCManager = %p\n", hSCManager); + DPRINT("lpServiceName: %s\n", lpServiceName); + DPRINT("lpDisplayName: %p\n", lpDisplayName); + DPRINT("*lpcchBuffer: %lu\n", *lpcchBuffer); + +// hManager = (PMANAGER_HANDLE)hSCManager; +// if (hManager->Handle.Tag != MANAGER_TAG) +// { +// DPRINT1("Invalid manager handle!\n"); +// return ERROR_INVALID_HANDLE; +// } + + dwLength = strlen(lpServiceName) + 1; + lpServiceNameW = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + dwLength * sizeof(WCHAR)); + if (!lpServiceNameW) + return ERROR_NOT_ENOUGH_MEMORY; + + MultiByteToWideChar(CP_ACP, + 0, + lpServiceName, + strlen(lpServiceName), + lpServiceNameW, + dwLength); + + lpService = ScmGetServiceEntryByName(lpServiceNameW); + + HeapFree(GetProcessHeap(), 0, lpServiceNameW); + + if (lpService == NULL) + { + DPRINT1("Could not find a service!\n"); + + /* If the service could not be found and lpcchBuffer is 0, windows + puts null in lpDisplayName and puts 1 in lpcchBuffer */ + if (*lpcchBuffer == 0) + { + *lpcchBuffer = 1; + *lpDisplayName = '\0'; + } + return ERROR_SERVICE_DOES_NOT_EXIST; + } + + if (!lpService->lpDisplayName) + { + dwLength = wcslen(lpService->lpServiceName); + if (lpServiceName != NULL && + *lpcchBuffer > dwLength) + { + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpServiceName, + wcslen(lpService->lpServiceName), + lpDisplayName, + *lpcchBuffer, + NULL, + NULL); + return ERROR_SUCCESS; + } + } + else + { + dwLength = wcslen(lpService->lpDisplayName); + if (lpDisplayName != NULL && + *lpcchBuffer > dwLength) + { + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpDisplayName, + wcslen(lpService->lpDisplayName), + lpDisplayName, + *lpcchBuffer, + NULL, + NULL); + return ERROR_SUCCESS; + } + } + + dwError = (*lpcchBuffer > dwLength) ? ERROR_SUCCESS : ERROR_INSUFFICIENT_BUFFER; + + *lpcchBuffer = dwLength * 2; + + return dwError; } @@ -2569,11 +2691,73 @@ handle_t BindingHandle, SC_RPC_HANDLE hSCManager, LPSTR lpDisplayName, - LPSTR lpKeyName, + LPSTR lpServiceName, LPBOUNDED_DWORD_4K lpcchBuffer) { - UNIMPLEMENTED; - return ERROR_CALL_NOT_IMPLEMENTED; + PSERVICE lpService; + DWORD dwLength; + DWORD dwError; + LPWSTR lpDisplayNameW; + + DPRINT("RGetServiceKeyNameA() called\n"); + DPRINT("hSCManager = %p\n", hSCManager); + DPRINT("lpDisplayName: %s\n", lpDisplayName); + DPRINT("lpServiceName: %p\n", lpServiceName); + DPRINT("*lpcchBuffer: %lu\n", *lpcchBuffer); + + dwLength = strlen(lpDisplayName) + 1; + lpDisplayNameW = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + dwLength * sizeof(WCHAR)); + if (!lpDisplayNameW) + return ERROR_NOT_ENOUGH_MEMORY; + + MultiByteToWideChar(CP_ACP, + 0, + lpDisplayName, + strlen(lpDisplayName), + lpDisplayNameW, + dwLength); + + lpService = ScmGetServiceEntryByDisplayName(lpDisplayNameW); + + HeapFree(GetProcessHeap(), 0, lpDisplayNameW); + + if (lpService == NULL) + { + DPRINT1("Could not find the service!\n"); + + /* If the service could not be found and lpcchBuffer is 0, + put null in lpDisplayName and puts 1 in lpcchBuffer, verified WINXP. */ + if (*lpcchBuffer == 0) + { + *lpcchBuffer = 1; + *lpServiceName = '\0'; + } + + return ERROR_SERVICE_DOES_NOT_EXIST; + } + + dwLength = wcslen(lpService->lpServiceName); + if (lpService != NULL && + *lpcchBuffer > dwLength) + { + WideCharToMultiByte(CP_ACP, + 0, + lpService->lpServiceName, + wcslen(lpService->lpServiceName), + lpServiceName, + dwLength, + NULL, + NULL); + return ERROR_SUCCESS; + } + + dwError = (*lpcchBuffer > dwLength) ? ERROR_SUCCESS : ERROR_INSUFFICIENT_BUFFER; + + *lpcchBuffer = dwLength * 2; + + return dwError; } Modified: trunk/reactos/dll/win32/advapi32/service/scm.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/service…
============================================================================== --- trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/service/scm.c [iso-8859-1] Fri Aug 29 05:01:06 2008 @@ -1227,6 +1227,9 @@ TRACE("GetServiceDisplayNameA() called\n"); + if (!lpDisplayName) + *lpcchBuffer = 0; + HandleBind(); _SEH_TRY @@ -1253,8 +1256,6 @@ return FALSE; } - (*lpcchBuffer)--; - return TRUE; } @@ -1273,6 +1274,9 @@ DWORD dwError; TRACE("GetServiceDisplayNameW() called\n"); + + if (!lpDisplayName) + *lpcchBuffer = 0; HandleBind(); @@ -1297,8 +1301,6 @@ return FALSE; } - (*lpcchBuffer)--; - return TRUE; } @@ -1317,6 +1319,9 @@ DWORD dwError; TRACE("GetServiceKeyNameA() called\n"); + + if (!lpServiceName) + *lpcchBuffer = 0; HandleBind(); @@ -1341,8 +1346,6 @@ return FALSE; } - (*lpcchBuffer)--; - return TRUE; } @@ -1361,6 +1364,9 @@ DWORD dwError; TRACE("GetServiceKeyNameW() called\n"); + + if (!lpDisplayName) + *lpcchBuffer = 0; HandleBind(); @@ -1384,8 +1390,6 @@ SetLastError(dwError); return FALSE; } - - (*lpcchBuffer)--; return TRUE; }
16 years, 3 months
1
0
0
0
[sserapion] 35747: commit missing file
by sserapion@svn.reactos.org
Author: sserapion Date: Fri Aug 29 03:09:44 2008 New Revision: 35747 URL:
http://svn.reactos.org/svn/reactos?rev=35747&view=rev
Log: commit missing file Added: branches/ros-amd64-bringup/reactos/dll/win32/acledit/acledit.spec - copied unchanged from r35655, branches/ros-amd64-bringup/reactos/dll/win32/acledit/acledit.spec
16 years, 3 months
1
0
0
0
[sserapion] 35746: Convert crtdll to WINE's spec file. Forwards most exports to msvcrt and reduces crtdll.dll from 328Kb to 188Kb
by sserapion@svn.reactos.org
Author: sserapion Date: Fri Aug 29 02:49:31 2008 New Revision: 35746 URL:
http://svn.reactos.org/svn/reactos?rev=35746&view=rev
Log: Convert crtdll to WINE's spec file. Forwards most exports to msvcrt and reduces crtdll.dll from 328Kb to 188Kb Added: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.spec (with props) Removed: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.def Modified: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.rbuild Removed: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.def URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/dll/w…
============================================================================== --- branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.def [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.def (removed) @@ -1,571 +1,0 @@ -; -; crtdll.def -; -; Exports from crtdll.dll from Windows 95 SYSTEM directory. Hopefully this -; should also work with the crtdll provided with Windows NT. -; Exports from crtdll.dll from Windows NT Server 4.0. -; -; Contributors: -; Created by Colin Peters <colin(a)bird.fu.is.saga-u.ac.jp> -; Modified by Adhi P. Yoedo <adhi(a)primatama.co.id> -; -; THIS SOFTWARE IS NOT COPYRIGHTED -; -; This source code is offered for use in the public domain. You may -; use, modify or distribute it freely. -; -; This code is distributed in the hope that it will be useful but -; WITHOUT ANY WARRANTY. ALL WARRENTIES, EXPRESS OR IMPLIED ARE HEREBY -; DISCLAMED. This includes but is not limited to warrenties of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -; -; $Revision: 1.19 $ -; $Author$ -; $Date$ -; -; These three functions appear to be name mangled in some way, so GCC is -; probably not going to be able to use them in any case. -; -; ??2@YAPAXI@Z -; ??3@YAXPAX@Z -; ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z -; -; Added functional equivalent placeholders: -; -; __builtin_new -; __builtin_delete -; _set_new_handler__FPFUi_i -; I commented out these, cause i dont get why they were added. -Gunnar -; -LIBRARY CRTDLL.DLL -EXPORTS -;__builtin_new -;__builtin_delete -??2@YAPAXI@Z=MSVCRT_operator_new -??3@YAXPAX@Z=MSVCRT_operator_delete -?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z=MSVCRT__set_new_handler -;_set_new_handler__FPFUi_i -_CIacos -_CIasin -_CIatan -_CIatan2 -_CIcos -_CIcosh -_CIexp -_CIfmod -_CIlog -_CIlog10 -_CIpow -_CIsin -_CIsinh -_CIsqrt -_CItan -_CItanh -_HUGE_dll=_HUGE DATA -_XcptFilter -__GetMainArgs -__argc_dll=__argc DATA -__argv_dll=__argv DATA -__dllonexit -__doserrno -__fpecode -__isascii=NTDLL.__isascii -__iscsym=NTDLL.__iscsym -__iscsymf=NTDLL.__iscsymf -__mb_cur_max_dll=__mb_cur_max DATA -__pxcptinfoptrs -__threadhandle -__threadid -__toascii=NTDLL.__toascii -_abnormal_termination -_access -_acmdln_dll=_acmdln DATA -_aexit_rtn_dll=_aexit_rtn DATA -_amsg_exit -_assert -_basemajor_dll=CRTDLL__basemajor_dll DATA -_baseminor_dll=CRTDLL__baseminor_dll DATA -_baseversion_dll=CRTDLL__baseversion_dll DATA -_beep -_beginthread -_c_exit -_cabs -_cexit -_cgets -_chdir -_chdrive -_chgsign -_chmod -_chsize -_clearfp -_close -_commit -_commode_dll=_commode DATA -_control87 -_controlfp -_copysign -_cprintf -_cpumode_dll=_cpumode DATA ;fixme: wine has CRTDLL__cpumode_dll -_cputs -_creat -_cscanf -_ctype DATA -_cwait -_daylight_dll=_daylight DATA -_dup -_dup2 -_ecvt -_endthread -_environ_dll=_environ DATA -_eof -_errno -_except_handler2 -_execl -_execle -_execlp -_execlpe -_execv -_execve -_execvp -_execvpe -_exit -_expand -_fcloseall -_fcvt -_fdopen -_fgetchar -_fgetwchar -_filbuf -;_fileinfo_dll=_fileinfo DATA -_filelength -_fileno DATA -_findclose -_findfirst -_findnext -_finite -_flsbuf -_flushall -_fmode_dll=_fmode DATA -_fpclass -_fpieee_flt -_fpreset -_fputchar -_fputwchar -_fsopen -_fstat=CRTDLL__fstat -_ftime -_ftol=NTDLL._ftol -_fullpath -_futime -_gcvt -_get_osfhandle -_getch -_getche -_getcwd -_getdcwd -_getdiskfree -_getdllprocaddr -_getdrive -_getdrives -_getpid -_getsystime -_getw -_global_unwind2 -_heapchk -_heapmin -_heapset -_heapwalk -_hypot -_initterm -_iob DATA -_isatty -_isctype -_ismbbalnum -_ismbbalpha -_ismbbgraph -_ismbbkalnum -_ismbbkana -_ismbbkpunct -_ismbblead -_ismbbprint -_ismbbpunct -_ismbbtrail -_ismbcalpha -_ismbcdigit -_ismbchira -_ismbckata -_ismbcl0 -_ismbcl1 -_ismbcl2 -_ismbclegal -_ismbclower -_ismbcprint -_ismbcspace -_ismbcsymbol -_ismbcupper -_ismbslead -_ismbstrail -_isnan -_itoa=NTDLL._itoa -_itow=NTDLL._itow -_j0 -_j1 -_jn -_kbhit -_lfind -_loaddll -_local_unwind2 -_locking -_logb -_lrotl -_lrotr -_lsearch -_lseek -_ltoa=NTDLL._ltoa -_ltow=NTDLL._ltow -_makepath -_matherr -_mbbtombc -_mbbtype -_mbccpy -_mbcjistojms -_mbcjmstojis -_mbclen -_mbctohira -_mbctokata -_mbctolower -_mbctombb -_mbctoupper -_mbctype DATA -_mbsbtype -_mbscat -_mbschr -_mbscmp -_mbscpy -_mbscspn -_mbsdec -_mbsdup -_mbsicmp -_mbsinc -_mbslen -_mbslwr -_mbsnbcat -_mbsnbcmp -_mbsnbcnt -_mbsnbcpy -_mbsnbicmp -_mbsnbset -_mbsncat -_mbsnccnt -_mbsncmp -_mbsncpy -_mbsnextc -_mbsnicmp -_mbsninc -_mbsnset -_mbspbrk -_mbsrchr -_mbsrev -_mbsset -_mbsspn -_mbsspnp -_mbsstr -_mbstok -_mbstrlen -_mbsupr -_memccpy -_memicmp=NTDLL._memicmp -_mkdir -_mktemp -_msize -_nextafter -_onexit -_open -_open_osfhandle -_osmajor_dll=CRTDLL__osmajor_dll DATA -_osminor_dll=CRTDLL__osminor_dll DATA -_osmode_dll=CRTDLL__osmode_dll DATA -_osver_dll=_osver DATA -_osversion_dll=CRTDLL__osversion_dll DATA -_pclose -_pctype_dll=_pctype DATA -_pgmptr_dll=_pgmptr DATA -_pipe -_popen -_purecall -_putch -_putenv -_putw -_pwctype_dll=_pwctype DATA -_read -_rmdir -_rmtmp -_rotl -_rotr -_scalb -_searchenv -_seterrormode -_setjmp -_setmode -_setsystime -_sleep -_snprintf -_snwprintf -_sopen -_spawnl -_spawnle -_spawnlp -_spawnlpe -_spawnv -_spawnve -_spawnvp -_spawnvpe -_splitpath=NTDLL._splitpath -_stat=CRTDLL__stat -_statusfp -_strcmpi=NTDLL._strcmpi -_strdate -_strdec -_strdup -_strerror -_stricmp=NTDLL._stricmp -_stricoll -_strinc -_strlwr=NTDLL._strlwr -_strncnt -_strnextc -_strnicmp=NTDLL._strnicmp -_strninc -_strnset -_strrev -_strset -_strspnp -_strtime -_strupr=NTDLL._strupr -_swab -_sys_errlist DATA -_sys_nerr_dll=_sys_nerr DATA -_tell -_tempnam -_timezone_dll=_timezone -_tolower=NTDLL._tolower -_toupper=NTDLL._toupper -_tzname DATA -_tzset -_ultoa=NTDLL._ultoa -_ultow=NTDLL._ultow -_umask -_ungetch -_unlink -_unloaddll -_utime -_vsnprintf -_vsnwprintf -_wcsdup -_wcsicmp -_wcsicoll -_wcslwr -_wcsnicmp=NTDLL._wcsnicmp -_wcsnset -_wcsrev -_wcsset -_wcsupr -_winmajor_dll=_winmajor DATA -_winminor_dll=_winminor DATA -_winver_dll=_winver DATA -_write -_wtoi=NTDLL._wtoi -_wtol=NTDLL._wtol -_y0 -_y1 -_yn -abort -abs=NTDLL.abs -acos -asctime -asin -atan=NTDLL.atan -atan2 -atexit -atof -atoi=NTDLL.atoi -atol=NTDLL.atol -bsearch=NTDLL.bsearch -calloc -ceil=NTDLL.ceil -clearerr -clock -cos=NTDLL.cos -cosh -ctime -difftime -div -exit -exp -fabs=NTDLL.fabs -fclose -feof -ferror -fflush -fgetc -fgetpos -fgets -fgetwc -floor=NTDLL.floor -fmod -fopen -fprintf -fputc -fputs -fputwc -fread -free -freopen -frexp -fscanf -fseek -fsetpos -ftell -fwprintf -fwrite -fwscanf -getc -getchar -getenv -gets -gmtime -is_wctype -isalnum=NTDLL.isalnum -isalpha=NTDLL.isalpha -iscntrl=NTDLL.iscntrl -isdigit=NTDLL.isdigit -isgraph=NTDLL.isgraph -isleadbyte -islower=NTDLL.islower -isprint=NTDLL.isprint -ispunct=NTDLL.ispunct -isspace=NTDLL.isspace -isupper=NTDLL.isupper -iswalnum -iswalpha=NTDLL.iswalpha -iswascii -iswcntrl -iswctype=NTDLL.iswctype -iswdigit=NTDLL.iswdigit -iswgraph -iswlower=NTDLL.iswlower -iswprint -iswpunct -iswspace=NTDLL.iswspace -iswupper -iswxdigit=NTDLL.iswxdigit -isxdigit=NTDLL.isxdigit -labs=NTDLL.labs -ldexp -ldiv -localeconv -localtime -log=NTDLL.log -log10 -longjmp -malloc -mblen -mbstowcs=NTDLL.mbstowcs -mbtowc -memchr=NTDLL.memchr -memcmp=NTDLL.memcmp -memcpy=NTDLL.memcpy -memmove=NTDLL.memmove -memset -mktime -modf -perror -pow -printf -putc -putchar -puts -qsort=NTDLL.qsort -raise -rand -realloc -remove -rename -rewind -scanf -setbuf -setlocale -setvbuf -signal -sin=NTDLL.sin -sinh -sprintf -sqrt=NTDLL.sqrt -srand -sscanf -strcat -strchr -strcmp=NTDLL.strcmp -strcoll -strcpy -strcspn -strerror -strftime -strlen -strncat -strncmp -strncpy -strpbrk=NTDLL.strpbrk -strrchr -strspn -strstr=NTDLL.strstr -strtod -strtok -strtol=NTDLL.strtol -strtoul -strtoull -strxfrm -swprintf -swscanf -system -tan=NTDLL.tan -tanh -time -tmpfile -tmpnam -tolower=NTDLL.tolower -toupper=NTDLL.toupper -towlower=NTDLL.towlower -towupper=NTDLL.towupper -ungetc -ungetwc -vfprintf -vfwprintf -vprintf -vsprintf -vswprintf -vwprintf -wcscat -wcschr -wcscmp -wcscoll -wcscpy -wcscspn -wcsftime -wcslen -wcsncat -wcsncmp -wcsncpy -wcspbrk -wcsrchr -wcsspn -wcsstr -wcstod -wcstok -wcstol=NTDLL.wcstol -wcstombs -wcstoul=NTDLL.wcstoul -wcsxfrm -wctomb -wprintf -wscanf Modified: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.rbuild URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/dll/w…
============================================================================== --- branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.rbuild [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.rbuild [iso-8859-1] Fri Aug 29 02:49:31 2008 @@ -1,11 +1,11 @@ <module name="crtdll" type="win32dll" baseaddress="${BASEADDRESS_CRTDLL}" mangledsymbols="true" installbase="system32" installname="crtdll.dll"> - <importlibrary definition="crtdll.def" /> + <importlibrary definition="crtdll.spec.def" /> <include base="crtdll">.</include> <include base="crt">include</include> <define name="_DISABLE_TIDENTS" /> <define name="_WIN32_IE">0x600</define> <define name="_WIN32_WINNT">0x501</define> - <define name="USE_MSVCRT_PREFIX" /> + <define name="_MSVCRT_" /> <define name="_MSVCRT_LIB_" /> <define name="__NO_CTYPE_INLINES" /> <define name="_CTYPE_DISABLE_MACROS" /> @@ -22,4 +22,5 @@ <pch>precomp.h</pch> <file>dllmain.c</file> <file>crtdll.rc</file> + <file>crtdll.spec</file> </module> Added: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.spec URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/dll/w…
============================================================================== --- branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.spec (added) +++ branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.spec [iso-8859-1] Fri Aug 29 02:49:31 2008 @@ -1,0 +1,527 @@ +# Old C runtime library. All functions provided by msvcrt + + @ cdecl ??2@YAPAXI@Z(long) msvcrt.??2@YAPAXI@Z + @ cdecl ??3@YAXPAX@Z(ptr) msvcrt.??3@YAXPAX@Z + @ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) msvcrt.?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z + @ cdecl _CIacos() msvcrt._CIacos + @ cdecl _CIasin() msvcrt._CIasin + @ cdecl _CIatan() msvcrt._CIatan + @ cdecl _CIatan2() msvcrt._CIatan2 + @ cdecl _CIcos() msvcrt._CIcos + @ cdecl _CIcosh() msvcrt._CIcosh + @ cdecl _CIexp() msvcrt._CIexp + @ cdecl _CIfmod() msvcrt._CIfmod + @ cdecl _CIlog() msvcrt._CIlog + @ cdecl _CIlog10() msvcrt._CIlog10 + @ cdecl _CIpow() msvcrt._CIpow + @ cdecl _CIsin() msvcrt._CIsin + @ cdecl _CIsinh() msvcrt._CIsinh + @ cdecl _CIsqrt() msvcrt._CIsqrt + @ cdecl _CItan() msvcrt._CItan + @ cdecl _CItanh() msvcrt._CItanh + @ extern _HUGE_dll msvcrt._HUGE + @ cdecl _XcptFilter(long ptr) msvcrt._XcptFilter + @ cdecl __GetMainArgs(ptr ptr ptr long) + @ extern __argc_dll msvcrt.__argc + @ extern __argv_dll msvcrt.__argv + @ cdecl __dllonexit(ptr ptr ptr) msvcrt.__dllonexit + @ cdecl __doserrno() msvcrt.__doserrno + @ cdecl __fpecode() msvcrt.__fpecode + @ cdecl __isascii(long) msvcrt.__isascii + @ cdecl __iscsym(long) msvcrt.__iscsym + @ cdecl __iscsymf(long) msvcrt.__iscsymf + @ extern __mb_cur_max_dll msvcrt.__mb_cur_max + @ cdecl __pxcptinfoptrs() msvcrt.__pxcptinfoptrs + @ cdecl __threadhandle() msvcrt.__threadhandle + @ cdecl __threadid() msvcrt.__threadid + @ cdecl __toascii(long) msvcrt.__toascii + @ cdecl _abnormal_termination() msvcrt._abnormal_termination + @ cdecl _access(str long) msvcrt._access + @ extern _acmdln_dll msvcrt._acmdln + @ extern _aexit_rtn_dll msvcrt._aexit_rtn + @ cdecl _amsg_exit(long) msvcrt._amsg_exit + @ cdecl _assert(str str long) msvcrt._assert + @ extern _basemajor_dll CRTDLL__basemajor_dll + @ extern _baseminor_dll CRTDLL__baseminor_dll + @ extern _baseversion_dll CRTDLL__baseversion_dll + @ cdecl _beep(long long) msvcrt._beep + @ cdecl _beginthread(ptr long ptr) msvcrt._beginthread + @ cdecl _c_exit() msvcrt._c_exit + @ cdecl _cabs(long) msvcrt._cabs + @ cdecl _cexit() msvcrt._cexit + @ cdecl _cgets(str) msvcrt._cgets + @ cdecl _chdir(str) msvcrt._chdir + @ cdecl _chdrive(long) msvcrt._chdrive + @ cdecl _chgsign( double ) msvcrt._chgsign + @ cdecl _chmod(str long) msvcrt._chmod + @ cdecl _chsize(long long) msvcrt._chsize + @ cdecl _clearfp() msvcrt._clearfp + @ cdecl _close(long) msvcrt._close + @ cdecl _commit(long) msvcrt._commit + @ extern _commode_dll msvcrt._commode + @ cdecl _control87(long long) msvcrt._control87 + @ cdecl _controlfp(long long) msvcrt._controlfp + @ cdecl _copysign( double double ) msvcrt._copysign + @ varargs _cprintf(str) msvcrt._cprintf + @ extern _cpumode_dll CRTDLL__cpumode_dll + @ cdecl _cputs(str) msvcrt._cputs + @ cdecl _creat(str long) msvcrt._creat + @ varargs _cscanf(str) msvcrt._cscanf + @ extern _ctype msvcrt._ctype + @ cdecl _cwait(ptr long long) msvcrt._cwait + @ extern _daylight_dll msvcrt._daylight + @ cdecl _dup(long) msvcrt._dup + @ cdecl _dup2(long long) msvcrt._dup2 + @ cdecl _ecvt( double long ptr ptr) msvcrt._ecvt + @ cdecl _endthread() msvcrt._endthread + @ extern _environ_dll msvcrt._environ + @ cdecl _eof(long) msvcrt._eof + @ cdecl _errno() msvcrt._errno + @ cdecl _except_handler2(ptr ptr ptr ptr) msvcrt._except_handler2 + @ varargs _execl(str str) msvcrt._execl + @ varargs _execle(str str) msvcrt._execle + @ varargs _execlp(str str) msvcrt._execlp + @ varargs _execlpe(str str) msvcrt._execlpe + @ cdecl _execv(str str) msvcrt._execv + @ cdecl _execve(str str str) msvcrt._execve + @ cdecl _execvp(str str) msvcrt._execvp + @ cdecl _execvpe(str str str) msvcrt._execvpe + @ cdecl _exit(long) msvcrt._exit + @ cdecl _expand(ptr long) msvcrt._expand + @ cdecl _fcloseall() msvcrt._fcloseall + @ cdecl _fcvt( double long ptr ptr) msvcrt._fcvt + @ cdecl _fdopen(long str) msvcrt._fdopen + @ cdecl _fgetchar() msvcrt._fgetchar + @ cdecl _fgetwchar() msvcrt._fgetwchar + @ cdecl _filbuf(ptr) msvcrt._filbuf + @ extern _fileinfo_dll msvcrt._fileinfo + @ cdecl _filelength(long) msvcrt._filelength + @ cdecl _fileno(ptr) msvcrt._fileno + @ cdecl _findclose(long) msvcrt._findclose + @ cdecl _findfirst(str ptr) msvcrt._findfirst + @ cdecl _findnext(long ptr) msvcrt._findnext + @ cdecl _finite( double ) msvcrt._finite + @ cdecl _flsbuf(long ptr) msvcrt._flsbuf + @ cdecl _flushall() msvcrt._flushall + @ extern _fmode_dll msvcrt._fmode + @ cdecl _fpclass(double) msvcrt._fpclass + @ cdecl _fpieee_flt(long ptr ptr) msvcrt._fpieee_flt + @ cdecl _fpreset() msvcrt._fpreset + @ cdecl _fputchar(long) msvcrt._fputchar + @ cdecl _fputwchar(long) msvcrt._fputwchar + @ cdecl _fsopen(str str long) msvcrt._fsopen + @ cdecl _fstat(long ptr) CRTDLL__fstat + @ cdecl _ftime(ptr) msvcrt._ftime + @ cdecl -ret64 _ftol() msvcrt._ftol + @ cdecl _fullpath(ptr str long) msvcrt._fullpath + @ cdecl _futime(long ptr) msvcrt._futime + @ cdecl _gcvt( double long str) msvcrt._gcvt + @ cdecl _get_osfhandle(long) msvcrt._get_osfhandle + @ cdecl _getch() msvcrt._getch + @ cdecl _getche() msvcrt._getche + @ cdecl _getcwd(str long) msvcrt._getcwd + @ cdecl _getdcwd(long str long) msvcrt._getdcwd + @ cdecl _getdiskfree(long ptr) msvcrt._getdiskfree + @ cdecl _getdllprocaddr(long str long) msvcrt._getdllprocaddr + @ cdecl _getdrive() msvcrt._getdrive + @ cdecl _getdrives() msvcrt._getdrives + @ cdecl _getpid() msvcrt._getpid + @ cdecl _getsystime(ptr) msvcrt._getsystime + @ cdecl _getw(ptr) msvcrt._getw + @ cdecl _global_unwind2(ptr) msvcrt._global_unwind2 + @ cdecl _heapchk() msvcrt._heapchk + @ cdecl _heapmin() msvcrt._heapmin + @ cdecl _heapset(long) msvcrt._heapset + @ cdecl _heapwalk(ptr) msvcrt._heapwalk + @ cdecl _hypot(double double) msvcrt._hypot + @ cdecl _initterm(ptr ptr) msvcrt._initterm + @ extern _iob msvcrt._iob + @ cdecl _isatty(long) msvcrt._isatty + @ cdecl _isctype(long long) msvcrt._isctype + @ cdecl _ismbbalnum(long) msvcrt._ismbbalnum + @ cdecl _ismbbalpha(long) msvcrt._ismbbalpha + @ cdecl _ismbbgraph(long) msvcrt._ismbbgraph + @ cdecl _ismbbkalnum(long) msvcrt._ismbbkalnum + @ cdecl _ismbbkana(long) msvcrt._ismbbkana + @ cdecl _ismbbkpunct(long) msvcrt._ismbbkpunct + @ cdecl _ismbblead(long) msvcrt._ismbblead + @ cdecl _ismbbprint(long) msvcrt._ismbbprint + @ cdecl _ismbbpunct(long) msvcrt._ismbbpunct + @ cdecl _ismbbtrail(long) msvcrt._ismbbtrail + @ cdecl _ismbcalpha(long) msvcrt._ismbcalpha + @ cdecl _ismbcdigit(long) msvcrt._ismbcdigit + @ cdecl _ismbchira(long) msvcrt._ismbchira + @ cdecl _ismbckata(long) msvcrt._ismbckata + @ cdecl _ismbcl0(long) msvcrt._ismbcl0 + @ cdecl _ismbcl1(long) msvcrt._ismbcl1 + @ cdecl _ismbcl2(long) msvcrt._ismbcl2 + @ cdecl _ismbclegal(long) msvcrt._ismbclegal + @ cdecl _ismbclower(long) msvcrt._ismbclower + @ cdecl _ismbcprint(long) msvcrt._ismbcprint + @ cdecl _ismbcspace(long) msvcrt._ismbcspace + @ cdecl _ismbcsymbol(long) msvcrt._ismbcsymbol + @ cdecl _ismbcupper(long) msvcrt._ismbcupper + @ cdecl _ismbslead(ptr ptr) msvcrt._ismbslead + @ cdecl _ismbstrail(ptr ptr) msvcrt._ismbstrail + @ cdecl _isnan( double ) msvcrt._isnan + @ cdecl _itoa(long ptr long) msvcrt._itoa + @ cdecl _itow(long ptr long) msvcrt._itow + @ cdecl _j0(double) msvcrt._j0 + @ cdecl _j1(double) msvcrt._j1 + @ cdecl _jn(long double) msvcrt._jn + @ cdecl _kbhit() msvcrt._kbhit + @ cdecl _lfind(ptr ptr ptr long ptr) msvcrt._lfind + @ cdecl _loaddll(str) msvcrt._loaddll + @ cdecl _local_unwind2(ptr long) msvcrt._local_unwind2 + @ cdecl _locking(long long long) msvcrt._locking + @ cdecl _logb( double ) msvcrt._logb + @ cdecl _lrotl(long long) msvcrt._lrotl + @ cdecl _lrotr(long long) msvcrt._lrotr + @ cdecl _lsearch(ptr ptr long long ptr) msvcrt._lsearch + @ cdecl _lseek(long long long) msvcrt._lseek + @ cdecl _ltoa(long ptr long) msvcrt._ltoa + @ cdecl _ltow(long ptr long) msvcrt._ltow + @ cdecl _makepath(str str str str str) msvcrt._makepath + @ cdecl _matherr(ptr) msvcrt._matherr + @ cdecl _mbbtombc(long) msvcrt._mbbtombc + @ cdecl _mbbtype(long long) msvcrt._mbbtype + @ cdecl _mbccpy(str str) msvcrt._mbccpy + @ cdecl _mbcjistojms(long) msvcrt._mbcjistojms + @ cdecl _mbcjmstojis(long) msvcrt._mbcjmstojis + @ cdecl _mbclen(ptr) msvcrt._mbclen + @ cdecl _mbctohira(long) msvcrt._mbctohira + @ cdecl _mbctokata(long) msvcrt._mbctokata + @ cdecl _mbctolower(long) msvcrt._mbctolower + @ cdecl _mbctombb(long) msvcrt._mbctombb + @ cdecl _mbctoupper(long) msvcrt._mbctoupper + @ extern _mbctype msvcrt._mbctype + @ cdecl _mbsbtype(str long) msvcrt._mbsbtype + @ cdecl _mbscat(str str) msvcrt._mbscat + @ cdecl _mbschr(str long) msvcrt._mbschr + @ cdecl _mbscmp(str str) msvcrt._mbscmp + @ cdecl _mbscpy(ptr str) msvcrt._mbscpy + @ cdecl _mbscspn(str str) msvcrt._mbscspn + @ cdecl _mbsdec(ptr ptr) msvcrt._mbsdec + @ cdecl _mbsdup(str) msvcrt._mbsdup + @ cdecl _mbsicmp(str str) msvcrt._mbsicmp + @ cdecl _mbsinc(str) msvcrt._mbsinc + @ cdecl _mbslen(str) msvcrt._mbslen + @ cdecl _mbslwr(str) msvcrt._mbslwr + @ cdecl _mbsnbcat(str str long) msvcrt._mbsnbcat + @ cdecl _mbsnbcmp(str str long) msvcrt._mbsnbcmp + @ cdecl _mbsnbcnt(ptr long) msvcrt._mbsnbcnt + @ cdecl _mbsnbcpy(ptr str long) msvcrt._mbsnbcpy + @ cdecl _mbsnbicmp(str str long) msvcrt._mbsnbicmp + @ cdecl _mbsnbset(str long long) msvcrt._mbsnbset + @ cdecl _mbsncat(str str long) msvcrt._mbsncat + @ cdecl _mbsnccnt(str long) msvcrt._mbsnccnt + @ cdecl _mbsncmp(str str long) msvcrt._mbsncmp + @ cdecl _mbsncpy(str str long) msvcrt._mbsncpy + @ cdecl _mbsnextc(str) msvcrt._mbsnextc + @ cdecl _mbsnicmp(str str long) msvcrt._mbsnicmp + @ cdecl _mbsninc(str long) msvcrt._mbsninc + @ cdecl _mbsnset(str long long) msvcrt._mbsnset + @ cdecl _mbspbrk(str str) msvcrt._mbspbrk + @ cdecl _mbsrchr(str long) msvcrt._mbsrchr + @ cdecl _mbsrev(str) msvcrt._mbsrev + @ cdecl _mbsset(str long) msvcrt._mbsset + @ cdecl _mbsspn(str str) msvcrt._mbsspn + @ cdecl _mbsspnp(str str) msvcrt._mbsspnp + @ cdecl _mbsstr(str str) msvcrt._mbsstr + @ cdecl _mbstok(str str) msvcrt._mbstok + @ cdecl _mbstrlen(str) msvcrt._mbstrlen + @ cdecl _mbsupr(str) msvcrt._mbsupr + @ cdecl _memccpy(ptr ptr long long) msvcrt._memccpy + @ cdecl _memicmp(str str long) msvcrt._memicmp + @ cdecl _mkdir(str) msvcrt._mkdir + @ cdecl _mktemp(str) msvcrt._mktemp + @ cdecl _msize(ptr) msvcrt._msize + @ cdecl _nextafter(double double) msvcrt._nextafter + @ cdecl _onexit(ptr) msvcrt._onexit + @ varargs _open(str long) msvcrt._open + @ cdecl _open_osfhandle(long long) msvcrt._open_osfhandle + @ extern _osmajor_dll CRTDLL__osmajor_dll + @ extern _osminor_dll CRTDLL__osminor_dll + @ extern _osmode_dll CRTDLL__osmode_dll + @ extern _osver_dll msvcrt._osver + @ extern _osversion_dll CRTDLL__osversion_dll + @ cdecl _pclose(ptr) msvcrt._pclose + @ extern _pctype_dll msvcrt._pctype + @ extern _pgmptr_dll msvcrt._pgmptr + @ cdecl _pipe(ptr long long) msvcrt._pipe + @ cdecl _popen(str str) msvcrt._popen + @ cdecl _purecall() msvcrt._purecall + @ cdecl _putch(long) msvcrt._putch + @ cdecl _putenv(str) msvcrt._putenv + @ cdecl _putw(long ptr) msvcrt._putw + @ extern _pwctype_dll msvcrt._pwctype + @ cdecl _read(long ptr long) msvcrt._read + @ cdecl _rmdir(str) msvcrt._rmdir + @ cdecl _rmtmp() msvcrt._rmtmp + @ cdecl _rotl(long long) msvcrt._rotl + @ cdecl _rotr(long long) msvcrt._rotr + @ cdecl _scalb( double long) msvcrt._scalb + @ cdecl _searchenv(str str ptr) msvcrt._searchenv + @ cdecl _seterrormode(long) msvcrt._seterrormode + @ cdecl -i386 _setjmp(ptr) msvcrt._setjmp + @ cdecl _setmode(long long) msvcrt._setmode + @ cdecl _setsystime(ptr long) msvcrt._setsystime + @ cdecl _sleep(long) msvcrt._sleep + @ varargs _snprintf(str long str) msvcrt._snprintf + @ varargs _snwprintf(wstr long wstr) msvcrt._snwprintf + @ varargs _sopen(str long long) msvcrt._sopen + @ varargs _spawnl(long str str) msvcrt._spawnl + @ varargs _spawnle(long str str) msvcrt._spawnle + @ varargs _spawnlp(long str str) msvcrt._spawnlp + @ varargs _spawnlpe(long str str) msvcrt._spawnlpe + @ cdecl _spawnv(long str ptr) msvcrt._spawnv + @ cdecl _spawnve(long str ptr ptr) msvcrt._spawnve + @ cdecl _spawnvp(long str ptr) msvcrt._spawnvp + @ cdecl _spawnvpe(long str ptr ptr) msvcrt._spawnvpe + @ cdecl _splitpath(str ptr ptr ptr ptr) msvcrt._splitpath + @ cdecl _stat(str ptr) CRTDLL__stat + @ cdecl _statusfp() msvcrt._statusfp + @ cdecl _strcmpi(str str) msvcrt._strcmpi + @ cdecl _strdate(ptr) msvcrt._strdate + @ cdecl _strdec(str str) + @ cdecl _strdup(str) msvcrt._strdup + @ cdecl _strerror(long) msvcrt._strerror + @ cdecl _stricmp(str str) msvcrt._stricmp + @ cdecl _stricoll(str str) msvcrt._stricoll + @ cdecl _strinc(str) + @ cdecl _strlwr(str) msvcrt._strlwr + @ cdecl _strncnt(str long) + @ cdecl _strnextc(str) + @ cdecl _strnicmp(str str long) msvcrt._strnicmp + @ cdecl _strninc(str long) + @ cdecl _strnset(str long long) msvcrt._strnset + @ cdecl _strrev(str) msvcrt._strrev + @ cdecl _strset(str long) msvcrt._strset + @ cdecl _strspnp(str str) + @ cdecl _strtime(ptr) msvcrt._strtime + @ cdecl _strupr(str) msvcrt._strupr + @ cdecl _swab(str str long) msvcrt._swab + @ extern _sys_errlist msvcrt._sys_errlist + @ extern _sys_nerr_dll msvcrt._sys_nerr + @ cdecl _tell(long) msvcrt._tell + @ cdecl _tempnam(str str) msvcrt._tempnam + @ extern _timezone_dll msvcrt._timezone + @ cdecl _tolower(long) msvcrt._tolower + @ cdecl _toupper(long) msvcrt._toupper + @ extern _tzname msvcrt._tzname + @ cdecl _tzset() msvcrt._tzset + @ cdecl _ultoa(long ptr long) msvcrt._ultoa + @ cdecl _umask(long) msvcrt._umask + @ cdecl _ungetch(long) msvcrt._ungetch + @ cdecl _unlink(str) msvcrt._unlink + @ cdecl _unloaddll(long) msvcrt._unloaddll + @ cdecl _utime(str ptr) msvcrt._utime + @ cdecl _vsnprintf(ptr long ptr ptr) msvcrt._vsnprintf + @ cdecl _vsnwprintf(ptr long wstr long) msvcrt._vsnwprintf + @ cdecl _wcsdup(wstr) msvcrt._wcsdup + @ cdecl _wcsicmp(wstr wstr) msvcrt._wcsicmp + @ cdecl _wcsicoll(wstr wstr) msvcrt._wcsicoll + @ cdecl _wcslwr(wstr) msvcrt._wcslwr + @ cdecl _wcsnicmp(wstr wstr long) msvcrt._wcsnicmp + @ cdecl _wcsnset(wstr long long) msvcrt._wcsnset + @ cdecl _wcsrev(wstr) msvcrt._wcsrev + @ cdecl _wcsset(wstr long) msvcrt._wcsset + @ cdecl _wcsupr(wstr) msvcrt._wcsupr + @ extern _winmajor_dll msvcrt._winmajor + @ extern _winminor_dll msvcrt._winminor + @ extern _winver_dll msvcrt._winver + @ cdecl _write(long ptr long) msvcrt._write + @ cdecl _wtoi(wstr) msvcrt._wtoi + @ cdecl _wtol(wstr) msvcrt._wtol + @ cdecl _y0(double) msvcrt._y0 + @ cdecl _y1(double) msvcrt._y1 + @ cdecl _yn(long double ) msvcrt._yn + @ cdecl abort() msvcrt.abort + @ cdecl abs(long) msvcrt.abs + @ cdecl acos(double) msvcrt.acos + @ cdecl asctime(ptr) msvcrt.asctime + @ cdecl asin(double) msvcrt.asin + @ cdecl atan(double) msvcrt.atan + @ cdecl atan2(double double) msvcrt.atan2 + @ cdecl atexit(ptr) msvcrt.atexit + @ cdecl atof(str) msvcrt.atof + @ cdecl atoi(str) msvcrt.atoi + @ cdecl atol(str) msvcrt.atol + @ cdecl bsearch(ptr ptr long long ptr) msvcrt.bsearch + @ cdecl calloc(long long) msvcrt.calloc + @ cdecl ceil(double) msvcrt.ceil + @ cdecl clearerr(ptr) msvcrt.clearerr + @ cdecl clock() msvcrt.clock + @ cdecl cos(double) msvcrt.cos + @ cdecl cosh(double) msvcrt.cosh + @ cdecl ctime(ptr) msvcrt.ctime + @ cdecl difftime(long long) msvcrt.difftime + @ cdecl div(long long) msvcrt.div + @ cdecl exit(long) msvcrt.exit + @ cdecl exp(double) msvcrt.exp + @ cdecl fabs(double) msvcrt.fabs + @ cdecl fclose(ptr) msvcrt.fclose + @ cdecl feof(ptr) msvcrt.feof + @ cdecl ferror(ptr) msvcrt.ferror + @ cdecl fflush(ptr) msvcrt.fflush + @ cdecl fgetc(ptr) msvcrt.fgetc + @ cdecl fgetpos(ptr ptr) msvcrt.fgetpos + @ cdecl fgets(ptr long ptr) msvcrt.fgets + @ cdecl fgetwc(ptr) msvcrt.fgetwc + @ cdecl floor(double) msvcrt.floor + @ cdecl fmod(double double) msvcrt.fmod + @ cdecl fopen(str str) msvcrt.fopen + @ varargs fprintf(ptr str) msvcrt.fprintf + @ cdecl fputc(long ptr) msvcrt.fputc + @ cdecl fputs(str ptr) msvcrt.fputs + @ cdecl fputwc(long ptr) msvcrt.fputwc + @ cdecl fread(ptr long long ptr) msvcrt.fread + @ cdecl free(ptr) msvcrt.free + @ cdecl freopen(str str ptr) msvcrt.freopen + @ cdecl frexp(double ptr) msvcrt.frexp + @ varargs fscanf(ptr str) msvcrt.fscanf + @ cdecl fseek(ptr long long) msvcrt.fseek + @ cdecl fsetpos(ptr ptr) msvcrt.fsetpos + @ cdecl ftell(ptr) msvcrt.ftell + @ varargs fwprintf(ptr wstr) msvcrt.fwprintf + @ cdecl fwrite(ptr long long ptr) msvcrt.fwrite + @ varargs fwscanf(ptr wstr) msvcrt.fwscanf + @ cdecl getc(ptr) msvcrt.getc + @ cdecl getchar() msvcrt.getchar + @ cdecl getenv(str) msvcrt.getenv + @ cdecl gets(str) msvcrt.gets + @ cdecl gmtime(ptr) msvcrt.gmtime + @ cdecl is_wctype(long long) msvcrt.is_wctype + @ cdecl isalnum(long) msvcrt.isalnum + @ cdecl isalpha(long) msvcrt.isalpha + @ cdecl iscntrl(long) msvcrt.iscntrl + @ cdecl isdigit(long) msvcrt.isdigit + @ cdecl isgraph(long) msvcrt.isgraph + @ cdecl isleadbyte(long) msvcrt.isleadbyte + @ cdecl islower(long) msvcrt.islower + @ cdecl isprint(long) msvcrt.isprint + @ cdecl ispunct(long) msvcrt.ispunct + @ cdecl isspace(long) msvcrt.isspace + @ cdecl isupper(long) msvcrt.isupper + @ cdecl iswalnum(long) msvcrt.iswalnum + @ cdecl iswalpha(long) msvcrt.iswalpha + @ cdecl iswascii(long) msvcrt.iswascii + @ cdecl iswcntrl(long) msvcrt.iswcntrl + @ cdecl iswctype(long long) msvcrt.iswctype + @ cdecl iswdigit(long) msvcrt.iswdigit + @ cdecl iswgraph(long) msvcrt.iswgraph + @ cdecl iswlower(long) msvcrt.iswlower + @ cdecl iswprint(long) msvcrt.iswprint + @ cdecl iswpunct(long) msvcrt.iswpunct + @ cdecl iswspace(long) msvcrt.iswspace + @ cdecl iswupper(long) msvcrt.iswupper + @ cdecl iswxdigit(long) msvcrt.iswxdigit + @ cdecl isxdigit(long) msvcrt.isxdigit + @ cdecl labs(long) msvcrt.labs + @ cdecl ldexp( double long) msvcrt.ldexp + @ cdecl ldiv(long long) msvcrt.ldiv + @ cdecl localeconv() msvcrt.localeconv + @ cdecl localtime(ptr) msvcrt.localtime + @ cdecl log(double) msvcrt.log + @ cdecl log10(double) msvcrt.log10 + @ cdecl -i386 longjmp(ptr long) msvcrt.longjmp + @ cdecl malloc(long) msvcrt.malloc + @ cdecl mblen(ptr long) msvcrt.mblen + @ cdecl mbstowcs(ptr str long) msvcrt.mbstowcs + @ cdecl mbtowc(wstr str long) msvcrt.mbtowc + @ cdecl memchr(ptr long long) msvcrt.memchr + @ cdecl memcmp(ptr ptr long) msvcrt.memcmp + @ cdecl memcpy(ptr ptr long) msvcrt.memcpy + @ cdecl memmove(ptr ptr long) msvcrt.memmove + @ cdecl memset(ptr long long) msvcrt.memset + @ cdecl mktime(ptr) msvcrt.mktime + @ cdecl modf(double ptr) msvcrt.modf + @ cdecl perror(str) msvcrt.perror + @ cdecl pow(double double) msvcrt.pow + @ varargs printf(str) msvcrt.printf + @ cdecl putc(long ptr) msvcrt.putc + @ cdecl putchar(long) msvcrt.putchar + @ cdecl puts(str) msvcrt.puts + @ cdecl qsort(ptr long long ptr) msvcrt.qsort + @ cdecl raise(long) msvcrt.raise + @ cdecl rand() msvcrt.rand + @ cdecl realloc(ptr long) msvcrt.realloc + @ cdecl remove(str) msvcrt.remove + @ cdecl rename(str str) msvcrt.rename + @ cdecl rewind(ptr) msvcrt.rewind + @ varargs scanf(str) msvcrt.scanf + @ cdecl setbuf(ptr ptr) msvcrt.setbuf + @ cdecl setlocale(long str) msvcrt.setlocale + @ cdecl setvbuf(ptr str long long) msvcrt.setvbuf + @ cdecl signal(long long) msvcrt.signal + @ cdecl sin(double) msvcrt.sin + @ cdecl sinh(double) msvcrt.sinh + @ varargs sprintf(ptr str) msvcrt.sprintf + @ cdecl sqrt(double) msvcrt.sqrt + @ cdecl srand(long) msvcrt.srand + @ varargs sscanf(str str) msvcrt.sscanf + @ cdecl strcat(str str) msvcrt.strcat + @ cdecl strchr(str long) msvcrt.strchr + @ cdecl strcmp(str str) msvcrt.strcmp + @ cdecl strcoll(str str) msvcrt.strcoll + @ cdecl strcpy(ptr str) msvcrt.strcpy + @ cdecl strcspn(str str) msvcrt.strcspn + @ cdecl strerror(long) msvcrt.strerror + @ cdecl strftime(str long str ptr) msvcrt.strftime + @ cdecl strlen(str) msvcrt.strlen + @ cdecl strncat(str str long) msvcrt.strncat + @ cdecl strncmp(str str long) msvcrt.strncmp + @ cdecl strncpy(ptr str long) msvcrt.strncpy + @ cdecl strpbrk(str str) msvcrt.strpbrk + @ cdecl strrchr(str long) msvcrt.strrchr + @ cdecl strspn(str str) msvcrt.strspn + @ cdecl strstr(str str) msvcrt.strstr + @ cdecl strtod(str ptr) msvcrt.strtod + @ cdecl strtok(str str) msvcrt.strtok + @ cdecl strtol(str ptr long) msvcrt.strtol + @ cdecl strtoul(str ptr long) msvcrt.strtoul + @ cdecl strxfrm(ptr str long) msvcrt.strxfrm + @ varargs swprintf(wstr wstr) msvcrt.swprintf + @ varargs swscanf(wstr wstr) msvcrt.swscanf + @ cdecl system(str) msvcrt.system + @ cdecl tan(double) msvcrt.tan + @ cdecl tanh(double) msvcrt.tanh + @ cdecl time(ptr) msvcrt.time + @ cdecl tmpfile() msvcrt.tmpfile + @ cdecl tmpnam(str) msvcrt.tmpnam + @ cdecl tolower(long) msvcrt.tolower + @ cdecl toupper(long) msvcrt.toupper + @ cdecl towlower(long) msvcrt.towlower + @ cdecl towupper(long) msvcrt.towupper + @ cdecl ungetc(long ptr) msvcrt.ungetc + @ cdecl ungetwc(long ptr) msvcrt.ungetwc + @ cdecl vfprintf(ptr str long) msvcrt.vfprintf + @ cdecl vfwprintf(ptr wstr long) msvcrt.vfwprintf + @ cdecl vprintf(str long) msvcrt.vprintf + @ cdecl vsprintf(ptr str ptr) msvcrt.vsprintf + @ cdecl vswprintf(ptr wstr long) msvcrt.vswprintf + @ cdecl vwprintf(wstr long) msvcrt.vwprintf + @ cdecl wcscat(wstr wstr) msvcrt.wcscat + @ cdecl wcschr(wstr long) msvcrt.wcschr + @ cdecl wcscmp(wstr wstr) msvcrt.wcscmp + @ cdecl wcscoll(wstr wstr) msvcrt.wcscoll + @ cdecl wcscpy(ptr wstr) msvcrt.wcscpy + @ cdecl wcscspn(wstr wstr) msvcrt.wcscspn + @ cdecl wcsftime(ptr long wstr ptr) msvcrt.wcsftime + @ cdecl wcslen(wstr) msvcrt.wcslen + @ cdecl wcsncat(wstr wstr long) msvcrt.wcsncat + @ cdecl wcsncmp(wstr wstr long) msvcrt.wcsncmp + @ cdecl wcsncpy(ptr wstr long) msvcrt.wcsncpy + @ cdecl wcspbrk(wstr wstr) msvcrt.wcspbrk + @ cdecl wcsrchr(wstr long) msvcrt.wcsrchr + @ cdecl wcsspn(wstr wstr) msvcrt.wcsspn + @ cdecl wcsstr(wstr wstr) msvcrt.wcsstr + @ cdecl wcstod(wstr ptr) msvcrt.wcstod + @ cdecl wcstok(wstr wstr) msvcrt.wcstok + @ cdecl wcstol(wstr ptr long) msvcrt.wcstol + @ cdecl wcstombs(ptr ptr long) msvcrt.wcstombs + @ cdecl wcstoul(wstr ptr long) msvcrt.wcstoul + @ cdecl wcsxfrm(ptr wstr long) msvcrt.wcsxfrm + @ cdecl wctomb(ptr long) msvcrt.wctomb + @ varargs wprintf(wstr) msvcrt.wprintf + @ varargs wscanf(wstr) msvcrt.wscanf Propchange: branches/ros-amd64-bringup/reactos/dll/win32/crtdll/crtdll.spec ------------------------------------------------------------------------------ svn:eol-style = native
16 years, 3 months
1
0
0
0
← Newer
1
...
7
8
9
10
11
12
13
...
86
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Results per page:
10
25
50
100
200