mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
sync to trunk head (37079)
svn path=/branches/ros-amd64-bringup/; revision=37088
This commit is contained in:
@@ -145,7 +145,7 @@ GetServices ( void )
|
||||
if (hService != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
/* check if service is required by the system*/
|
||||
if (!QueryServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPBYTE)pServiceFailureActions, 0, &BytesNeeded))
|
||||
if (!QueryServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPBYTE)NULL, 0, &BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
@@ -156,11 +156,17 @@ GetServices ( void )
|
||||
if (!QueryServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, (LPBYTE)pServiceFailureActions, BytesNeeded, &BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceFailureActions);
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -183,22 +189,32 @@ GetServices ( void )
|
||||
|
||||
/* get vendor of service binary */
|
||||
BytesNeeded = 0;
|
||||
if (!QueryServiceConfig(hService, pServiceConfig, 0, &BytesNeeded))
|
||||
if (!QueryServiceConfig(hService, NULL, 0, &BytesNeeded))
|
||||
{
|
||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
pServiceConfig = (LPQUERY_SERVICE_CONFIG) HeapAlloc(GetProcessHeap(), 0, BytesNeeded);
|
||||
if (pServiceConfig == NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
|
||||
}
|
||||
if (!QueryServiceConfig(hService, pServiceConfig, BytesNeeded, &BytesNeeded))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceConfig);
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else /* exit on failure */
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -221,11 +237,18 @@ GetServices ( void )
|
||||
{
|
||||
lpData = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, dwLen);
|
||||
if (lpData == NULL)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
|
||||
}
|
||||
if (!GetFileVersionInfo (FileName, dwHandle, dwLen, lpData))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, lpData);
|
||||
HeapFree(GetProcessHeap(), 0, pServiceStatus);
|
||||
CloseServiceHandle(hService);
|
||||
CloseServiceHandle(ScHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -296,6 +296,10 @@ BOOL GetEventMessage(
|
||||
|
||||
// Allocate space for parameters
|
||||
szArguments = (LPTSTR*)malloc(sizeof(LPVOID)* pevlr->NumStrings);
|
||||
if (!szArguments)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < pevlr->NumStrings ; i++)
|
||||
{
|
||||
@@ -372,6 +376,8 @@ BOOL GetEventMessage(
|
||||
wsprintf (EventText, szStringIDNotFound , (DWORD)(pevlr->EventID & 0xFFFF) , SourceName );
|
||||
}
|
||||
|
||||
free(szArguments);
|
||||
|
||||
// No more dlls to try , return result
|
||||
return bDone;
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ main(int argc, char **argv)
|
||||
static void
|
||||
userlist(int argc, char **argv)
|
||||
{
|
||||
int *used;
|
||||
int *used = NULL;
|
||||
char **ap, **nargv, **np, **p;
|
||||
WORD wVersionRequested;
|
||||
WSADATA wsaData;
|
||||
@@ -166,6 +166,8 @@ userlist(int argc, char **argv)
|
||||
|
||||
/* Bring down winsock */
|
||||
WSACleanup();
|
||||
free(nargv);
|
||||
free(used);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -454,7 +454,10 @@ VOID ShowInfo(BOOL bAll)
|
||||
|
||||
_tprintf(_T("\tIP Address. . . . . . . . . . . . : %s\n"), pAdapter->IpAddressList.IpAddress.String);
|
||||
_tprintf(_T("\tSubnet Mask . . . . . . . . . . . : %s\n"), pAdapter->IpAddressList.IpMask.String);
|
||||
_tprintf(_T("\tDefault Gateway . . . . . . . . . : %s\n"), pAdapter->GatewayList.IpAddress.String);
|
||||
if (pAdapter->GatewayList.IpAddress.String[0] != '0')
|
||||
_tprintf(_T("\tDefault Gateway . . . . . . . . . : %s\n"), pAdapter->GatewayList.IpAddress.String);
|
||||
else
|
||||
_tprintf(_T("\tDefault Gateway . . . . . . . . . :\n"));
|
||||
|
||||
if (bAll)
|
||||
{
|
||||
|
||||
@@ -525,7 +525,7 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
|
||||
&Adapter->NteContext,
|
||||
&Adapter->NteInstance );
|
||||
if (hkey) {
|
||||
RegSetValueExA(hkey, "DhcpIPAddress", 0, REG_SZ, (LPBYTE)new_lease->address.iabuf, strlen(new_lease->address.iabuf)+1);
|
||||
RegSetValueExA(hkey, "DhcpIPAddress", 0, REG_SZ, (LPBYTE)piaddr(new_lease->address), strlen(piaddr(new_lease->address))+1);
|
||||
Buffer[0] = '\0';
|
||||
for(i = 0; i < new_lease->options[DHO_SUBNET_MASK].len; i++)
|
||||
{
|
||||
|
||||
@@ -699,6 +699,15 @@ ITrayWindowImpl_RegLoadSettings(IN OUT ITrayWindowImpl *This)
|
||||
|
||||
/* FIXME: Are there more flags? */
|
||||
|
||||
if (This->hWnd != NULL)
|
||||
SetWindowPos (This->hWnd,
|
||||
This->AlwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
SWP_NOMOVE | SWP_NOSIZE);
|
||||
|
||||
if (sr.Position > ABE_BOTTOM)
|
||||
This->Position = ABE_BOTTOM;
|
||||
else
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define _SMSS_H_INCLUDED_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#define WIN32_NO_STATUS
|
||||
#include <windows.h>
|
||||
#define NTOS_MODE_USER
|
||||
|
||||
@@ -1367,7 +1367,7 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
|
||||
if (!resInfo)
|
||||
return ERROR_OUTOFMEMORY;
|
||||
|
||||
size = sizeof(FIXED_INFO) + (resInfo->riCount > 0 ? (resInfo->riCount - 1) *
|
||||
size = sizeof(FIXED_INFO) + (resInfo->riCount > 1 ? (resInfo->riCount-1) *
|
||||
sizeof(IP_ADDR_STRING) : 0);
|
||||
if (!pFixedInfo || *pOutBufLen < size) {
|
||||
*pOutBufLen = size;
|
||||
@@ -1383,25 +1383,16 @@ DWORD WINAPI GetNetworkParams(PFIXED_INFO pFixedInfo, PULONG pOutBufLen)
|
||||
|
||||
TRACE("GetComputerNameExA: %s\n", pFixedInfo->DomainName);
|
||||
|
||||
if (resInfo->riCount > 0) {
|
||||
PIP_ADDR_STRING ptr;
|
||||
int i;
|
||||
|
||||
for (i = 0, ptr = &pFixedInfo->DnsServerList; i < resInfo->riCount && ptr;
|
||||
i++, ptr = ptr->Next) {
|
||||
struct sockaddr_in *addr_v4 =
|
||||
(struct sockaddr_in *)&resInfo->riAddressList[i];
|
||||
toIPAddressString
|
||||
(addr_v4->sin_addr.s_addr,
|
||||
ptr->IpAddress.String);
|
||||
if (i == resInfo->riCount - 1)
|
||||
ptr->Next = NULL;
|
||||
else if (i == 0)
|
||||
ptr->Next = (PIP_ADDR_STRING)((LPBYTE)pFixedInfo + sizeof(FIXED_INFO));
|
||||
else
|
||||
ptr->Next = (PIP_ADDR_STRING)((PBYTE)ptr + sizeof(IP_ADDR_STRING));
|
||||
if (resInfo->riCount > 0)
|
||||
{
|
||||
CopyMemory(&pFixedInfo->DnsServerList, resInfo->DnsList, sizeof(IP_ADDR_STRING));
|
||||
if (resInfo->riCount > 1)
|
||||
{
|
||||
pFixedInfo->DnsServerList.Next = (struct _IP_ADDR_STRING*)((char*)pFixedInfo + sizeof(FIXED_INFO));
|
||||
CopyMemory(pFixedInfo->DnsServerList.Next, resInfo->DnsList->Next, sizeof(IP_ADDR_STRING) * (resInfo->riCount-1));
|
||||
}
|
||||
}
|
||||
|
||||
pFixedInfo->NodeType = HYBRID_NODETYPE;
|
||||
regReturn = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
|
||||
"SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP", 0, KEY_READ, &hKey);
|
||||
@@ -1490,7 +1481,7 @@ static void CreateNameServerListEnumNamesFunc( PWCHAR Interface, PWCHAR Server,
|
||||
Context->uSizeRequired += sizeof(IP_ADDR_STRING);
|
||||
if (Context->uSizeAvailable >= Context->uSizeRequired)
|
||||
{
|
||||
pNext = ((char*)Context->pLastAddr) + sizeof(IP_ADDR_STRING);
|
||||
pNext = (IP_ADDR_STRING*)(((char*)Context->pLastAddr) + sizeof(IP_ADDR_STRING));
|
||||
WideCharToMultiByte(CP_ACP, 0, Server, -1, pNext->IpAddress.String, 16, NULL, NULL);
|
||||
pNext->IpAddress.String[15] = '\0';
|
||||
Context->pLastAddr->Next = pNext;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
typedef struct _IPHLP_RES_INFO {
|
||||
DWORD riCount;
|
||||
IP_ADDR_STRING * DnsList;
|
||||
struct sockaddr_in *riAddressList;
|
||||
} IPHLP_RES_INFO, *PIPHLP_RES_INFO;
|
||||
|
||||
|
||||
@@ -49,8 +49,7 @@
|
||||
|
||||
typedef struct _NAME_SERVER_LIST_PRIVATE {
|
||||
UINT NumServers;
|
||||
UINT CurrentName;
|
||||
PIP_ADDRESS_STRING AddrString;
|
||||
IP_ADDR_STRING * pCurrent;
|
||||
} NAME_SERVER_LIST_PRIVATE, *PNAME_SERVER_LIST_PRIVATE;
|
||||
|
||||
NTSYSAPI
|
||||
@@ -177,22 +176,23 @@ static void CreateNameServerListEnumIfFuncCount( HKEY RegHandle,
|
||||
CreateNameServerListEnumNamesFuncCount);
|
||||
}
|
||||
|
||||
VOID CreateNameServerListEnumNamesFunc( PWCHAR Interface,
|
||||
PWCHAR Server,
|
||||
PVOID _Data ) {
|
||||
VOID CreateNameServerListEnumNamesFunc(
|
||||
PWCHAR Interface,
|
||||
PWCHAR Server,
|
||||
PVOID _Data )
|
||||
{
|
||||
PNAME_SERVER_LIST_PRIVATE Data = (PNAME_SERVER_LIST_PRIVATE)_Data;
|
||||
|
||||
if (WideCharToMultiByte(CP_ACP, 0, Server, -1,
|
||||
Data->AddrString[Data->CurrentName].String,
|
||||
16, NULL, NULL))
|
||||
{
|
||||
Data->AddrString[Data->CurrentName].String[15] = '\0';
|
||||
Data->CurrentName++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Data->AddrString[Data->CurrentName].String[0] = '\0';
|
||||
}
|
||||
if (WideCharToMultiByte(CP_ACP, 0, Server, -1, Data->pCurrent->IpAddress.String, 16, NULL, NULL))
|
||||
{
|
||||
Data->pCurrent->Next = (struct _IP_ADDR_STRING*)(char*)Data->pCurrent + sizeof(IP_ADDR_STRING);
|
||||
Data->pCurrent = Data->pCurrent->Next;
|
||||
Data->NumServers++;
|
||||
}
|
||||
else
|
||||
{
|
||||
Data->pCurrent->IpAddress.String[0] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
static void CreateNameServerListEnumIfFunc( HKEY RegHandle,
|
||||
@@ -213,51 +213,37 @@ static void MakeNameServerList( PNAME_SERVER_LIST_PRIVATE PrivateData ) {
|
||||
}
|
||||
|
||||
PIPHLP_RES_INFO getResInfo() {
|
||||
DWORD i, ServerCount;
|
||||
NAME_SERVER_LIST_PRIVATE PrivateNSEnum = { 0 };
|
||||
DWORD ServerCount;
|
||||
NAME_SERVER_LIST_PRIVATE PrivateNSEnum;
|
||||
PIPHLP_RES_INFO ResInfo;
|
||||
struct sockaddr_in *AddrList;
|
||||
IP_ADDR_STRING * DnsList;
|
||||
|
||||
PrivateNSEnum.NumServers = 0;
|
||||
ServerCount = CountNameServers( &PrivateNSEnum );
|
||||
|
||||
PrivateNSEnum.NumServers = ServerCount;
|
||||
PrivateNSEnum.AddrString =
|
||||
(PIP_ADDRESS_STRING)
|
||||
RtlAllocateHeap( GetProcessHeap(), 0,
|
||||
ServerCount * sizeof(IP_ADDRESS_STRING) );
|
||||
PrivateNSEnum.CurrentName = 0;
|
||||
DnsList = HeapAlloc(GetProcessHeap(), 0, ServerCount * sizeof(IP_ADDR_STRING));
|
||||
ZeroMemory(DnsList, ServerCount * sizeof(IP_ADDR_STRING));
|
||||
|
||||
ResInfo =
|
||||
(PIPHLP_RES_INFO)RtlAllocateHeap
|
||||
( GetProcessHeap(), 0,
|
||||
sizeof(IPHLP_RES_INFO) +
|
||||
(ServerCount * sizeof(struct sockaddr_in)) );
|
||||
|
||||
if( !ResInfo ) {
|
||||
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
|
||||
return NULL;
|
||||
ResInfo = (PIPHLP_RES_INFO)RtlAllocateHeap ( GetProcessHeap(), 0, sizeof(IPHLP_RES_INFO));
|
||||
if( !ResInfo )
|
||||
{
|
||||
HeapFree( GetProcessHeap(), 0, DnsList );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ResInfo->riCount = ServerCount;
|
||||
AddrList = (struct sockaddr_in *)
|
||||
(((PCHAR)ResInfo) + sizeof(IPHLP_RES_INFO));
|
||||
ResInfo->riAddressList = AddrList;
|
||||
PrivateNSEnum.NumServers = 0;
|
||||
PrivateNSEnum.pCurrent = DnsList;
|
||||
|
||||
MakeNameServerList( &PrivateNSEnum );
|
||||
|
||||
for( i = 0; i < PrivateNSEnum.CurrentName; i++ ) {
|
||||
/* Hmm seems that dns servers are always AF_INET but ... */
|
||||
ResInfo->riAddressList[i].sin_family = AF_INET;
|
||||
ResInfo->riAddressList[i].sin_addr.s_addr =
|
||||
inet_addr(PrivateNSEnum.AddrString[i].String );
|
||||
ResInfo->riAddressList[i].sin_port = 0;
|
||||
}
|
||||
|
||||
RtlFreeHeap( GetProcessHeap(), 0, PrivateNSEnum.AddrString );
|
||||
ResInfo->DnsList = DnsList;
|
||||
ResInfo->riCount = PrivateNSEnum.NumServers;
|
||||
|
||||
return ResInfo;
|
||||
}
|
||||
|
||||
VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr ) {
|
||||
VOID disposeResInfo( PIPHLP_RES_INFO InfoPtr )
|
||||
{
|
||||
RtlFreeHeap( GetProcessHeap(), 0, InfoPtr );
|
||||
HeapFree(GetProcessHeap(), 0, InfoPtr->DnsList);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ typedef struct
|
||||
LONG ref;
|
||||
NetCfgComponentItem * pItem;
|
||||
INetCfgComponentPropertyUi * pProperty;
|
||||
INetCfgComponentControl * pNCCC;
|
||||
INetCfg * pNCfg;
|
||||
}INetCfgComponentImpl;
|
||||
|
||||
@@ -20,8 +19,6 @@ typedef struct
|
||||
INetCfg * pNCfg;
|
||||
}IEnumNetCfgComponentImpl;
|
||||
|
||||
|
||||
|
||||
HRESULT
|
||||
STDCALL
|
||||
INetCfgComponent_fnQueryInterface(
|
||||
@@ -43,7 +40,6 @@ INetCfgComponent_fnQueryInterface(
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
|
||||
ULONG
|
||||
STDCALL
|
||||
INetCfgComponent_fnAddRef(
|
||||
@@ -420,7 +416,7 @@ CreateNotificationObject(
|
||||
return hr;
|
||||
}
|
||||
This->pProperty = pNCCPU;
|
||||
This->pNCCC = pNCCC;
|
||||
This->pItem->pNCCC = pNCCC;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
@@ -467,20 +463,14 @@ INetCfgComponent_fnRaisePropertyUi(
|
||||
pinfo.pszCaption = This->pItem->szDisplayName;
|
||||
|
||||
iResult = PropertySheetW(&pinfo);
|
||||
|
||||
CoTaskMemFree(hppages);
|
||||
if (iResult < 0)
|
||||
if (iResult > 0)
|
||||
{
|
||||
//FIXME
|
||||
INetCfgComponentControl_CancelChanges(This->pNCCC);
|
||||
return E_ABORT;
|
||||
}
|
||||
else
|
||||
{
|
||||
//FIXME
|
||||
INetCfgComponentControl_ApplyRegistryChanges(This->pNCCC);
|
||||
/* indicate that settings should be stored */
|
||||
This->pItem->bChanged = TRUE;
|
||||
return S_OK;
|
||||
}
|
||||
return S_FALSE;
|
||||
}
|
||||
static const INetCfgComponentVtbl vt_NetCfgComponent =
|
||||
{
|
||||
|
||||
@@ -533,6 +533,56 @@ INetCfg_fnInitialize(
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
VOID
|
||||
ApplyOrCancelChanges(
|
||||
NetCfgComponentItem *pHead,
|
||||
const CLSID * lpClassGUID,
|
||||
BOOL bApply)
|
||||
{
|
||||
HKEY hKey;
|
||||
WCHAR szName[200];
|
||||
LPOLESTR pszGuid;
|
||||
|
||||
while(pHead)
|
||||
{
|
||||
if (pHead->bChanged)
|
||||
{
|
||||
if (IsEqualGUID(lpClassGUID, &GUID_DEVCLASS_NET))
|
||||
{
|
||||
if (bApply)
|
||||
{
|
||||
if (StringFromCLSID(&pHead->InstanceId, &pszGuid) == NOERROR)
|
||||
{
|
||||
swprintf(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\%s", pszGuid);
|
||||
CoTaskMemFree(pszGuid);
|
||||
|
||||
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szName, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE)pHead->szDisplayName, (wcslen(pHead->szDisplayName)+1) * sizeof(WCHAR));
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (pHead->pNCCC)
|
||||
{
|
||||
if (bApply)
|
||||
{
|
||||
INetCfgComponentControl_ApplyRegistryChanges(pHead->pNCCC);
|
||||
//FIXME
|
||||
// implement INetCfgPnpReconfigCallback and pass it to
|
||||
//INetCfgComponentControl_ApplyPnpChanges(pHead->pNCCC, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
INetCfgComponentControl_CancelChanges(pHead->pNCCC);
|
||||
}
|
||||
}
|
||||
}
|
||||
pHead = pHead->pNext;
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT
|
||||
STDCALL
|
||||
INetCfg_fnUninitialize(
|
||||
@@ -557,8 +607,12 @@ INetCfg_fnApply(
|
||||
if (!This->bInitialized)
|
||||
return NETCFG_E_NOT_INITIALIZED;
|
||||
|
||||
ApplyOrCancelChanges(This->pNet, &GUID_DEVCLASS_NET, TRUE);
|
||||
ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, TRUE);
|
||||
ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, TRUE);
|
||||
ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, TRUE);
|
||||
|
||||
return E_NOTIMPL;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT
|
||||
@@ -571,7 +625,11 @@ INetCfg_fnCancel(
|
||||
if (!This->bInitialized)
|
||||
return NETCFG_E_NOT_INITIALIZED;
|
||||
|
||||
return E_NOTIMPL;
|
||||
ApplyOrCancelChanges(This->pClient, &GUID_DEVCLASS_NETCLIENT, FALSE);
|
||||
ApplyOrCancelChanges(This->pService, &GUID_DEVCLASS_NETSERVICE, FALSE);
|
||||
ApplyOrCancelChanges(This->pProtocol, &GUID_DEVCLASS_NETTRANS, FALSE);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<library>ole32</library>
|
||||
<library>user32</library>
|
||||
<library>comctl32</library>
|
||||
<library>ws2_32</library>
|
||||
<file>netcfgx.c</file>
|
||||
<file>netcfgx.spec</file>
|
||||
<file>classfactory.c</file>
|
||||
|
||||
@@ -34,6 +34,7 @@ typedef struct tagNetCfgComponentItem
|
||||
ULONG Status; //Y
|
||||
BOOL bChanged; //Y
|
||||
struct tagNetCfgComponentItem * pNext;
|
||||
INetCfgComponentControl * pNCCC;
|
||||
}NetCfgComponentItem;
|
||||
|
||||
/* netcfg_iface.c */
|
||||
|
||||
@@ -34,6 +34,7 @@ typedef struct tagIP_ADDR
|
||||
DWORD Subnetmask;
|
||||
USHORT Metric;
|
||||
}u;
|
||||
ULONG NTEContext;
|
||||
struct tagIP_ADDR * Next;
|
||||
}IP_ADDR;
|
||||
|
||||
@@ -115,6 +116,7 @@ INT GetSelectedItem(HWND hDlgCtrl);
|
||||
HRESULT InitializeTcpipBasicDlgCtrls(HWND hwndDlg, TcpipSettings * pCurSettings);
|
||||
VOID InsertColumnToListView(HWND hDlgCtrl, UINT ResId, UINT SubItem, UINT Size);
|
||||
INT_PTR StoreTcpipBasicSettings(HWND hwndDlg, TcpipConfNotifyImpl * This, BOOL bApply);
|
||||
HRESULT Initialize(TcpipConfNotifyImpl * This);
|
||||
|
||||
VOID
|
||||
DisplayError(UINT ResTxt, UINT ResTitle, UINT Type)
|
||||
@@ -2172,6 +2174,15 @@ StoreTcpipBasicSettings(
|
||||
/* store default gateway */
|
||||
This->pCurrentConfig->Gw->IpAddress = dwIpAddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (This->pCurrentConfig->Gw)
|
||||
{
|
||||
IP_ADDR * pNextGw = This->pCurrentConfig->Gw->Next;
|
||||
CoTaskMemFree(This->pCurrentConfig->Gw);
|
||||
This->pCurrentConfig->Gw = pNextGw;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2302,7 +2313,7 @@ InitializeTcpipBasicDlgCtrls(
|
||||
/* set current hostmask */
|
||||
SendDlgItemMessageA(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->u.Subnetmask);
|
||||
}
|
||||
if (pCurSettings->Gw->IpAddress)
|
||||
if (pCurSettings->Gw && pCurSettings->Gw->IpAddress)
|
||||
{
|
||||
/* set current gateway */
|
||||
SendDlgItemMessageA(hwndDlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Gw->IpAddress);
|
||||
@@ -2373,6 +2384,7 @@ CopyIpAddrString(
|
||||
if (Type == SUBMASK)
|
||||
{
|
||||
pNew->u.Subnetmask = GetIpAddressFromStringA(pCurrent->IpMask.String);
|
||||
pNew->NTEContext = pCurrent->Context;
|
||||
}
|
||||
else if (Type == METRIC)
|
||||
{
|
||||
@@ -2632,6 +2644,7 @@ LoadDNSSettings(
|
||||
HKEY hKey;
|
||||
DWORD dwSize;
|
||||
|
||||
|
||||
This->pCurrentConfig->pDNS = (TcpipAdvancedDNSDlgSettings*) CoTaskMemAlloc(sizeof(TcpipAdvancedDNSDlgSettings));
|
||||
if (!This->pCurrentConfig->pDNS)
|
||||
return E_FAIL;
|
||||
@@ -2748,7 +2761,7 @@ LoadFilterSettings(
|
||||
|
||||
|
||||
HRESULT
|
||||
InitializeTcpipBasicDlg(TcpipConfNotifyImpl * This)
|
||||
Initialize(TcpipConfNotifyImpl * This)
|
||||
{
|
||||
DWORD dwSize;
|
||||
WCHAR szBuffer[50];
|
||||
@@ -2876,7 +2889,7 @@ INetCfgComponentPropertyUi_fnMergePropPages(
|
||||
HRESULT hr;
|
||||
TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
|
||||
|
||||
hr = InitializeTcpipBasicDlg(This);
|
||||
hr = Initialize(This);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
@@ -3092,24 +3105,37 @@ INetCfgComponentControl_fnApplyRegistryChanges(
|
||||
LPOLESTR pStr;
|
||||
DWORD dwSize;
|
||||
WCHAR szBuffer[200];
|
||||
TcpipSettings * pCurrentConfig, *pOldConfig;
|
||||
ULONG NTEInstance;
|
||||
|
||||
TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
|
||||
|
||||
pCurrentConfig = This->pCurrentConfig;
|
||||
This->pCurrentConfig = NULL;
|
||||
|
||||
if (FAILED(Initialize(This)))
|
||||
{
|
||||
This->pCurrentConfig = pCurrentConfig;
|
||||
return E_FAIL;
|
||||
}
|
||||
pOldConfig = This->pCurrentConfig;
|
||||
This->pCurrentConfig = pCurrentConfig;
|
||||
|
||||
//MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyRegistryChanges", NULL, MB_OK);
|
||||
|
||||
|
||||
if (RegCreateKeyExW(hKey, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
|
||||
{
|
||||
if (This->pCurrentConfig->pDNS)
|
||||
if (pCurrentConfig->pDNS)
|
||||
{
|
||||
RegSetValueExW(hKey, L"UseDomainNameDevolution", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->UseDomainNameDevolution, sizeof(DWORD));
|
||||
RegSetValueExW(hKey, L"SearchList", 0, REG_SZ, (LPBYTE)This->pCurrentConfig->pDNS->szSearchList,
|
||||
(wcslen(This->pCurrentConfig->pDNS->szSearchList)+1) * sizeof(WCHAR));
|
||||
RegSetValueExW(hKey, L"UseDomainNameDevolution", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->pDNS->UseDomainNameDevolution, sizeof(DWORD));
|
||||
RegSetValueExW(hKey, L"SearchList", 0, REG_SZ, (LPBYTE)pCurrentConfig->pDNS->szSearchList,
|
||||
(wcslen(pCurrentConfig->pDNS->szSearchList)+1) * sizeof(WCHAR));
|
||||
}
|
||||
if (This->pCurrentConfig->pFilter)
|
||||
if (pCurrentConfig->pFilter)
|
||||
{
|
||||
RegSetValueExW(hKey, L"EnableSecurityFilters", 0, REG_DWORD,
|
||||
(LPBYTE)&This->pCurrentConfig->pFilter->EnableSecurityFilters, sizeof(DWORD));
|
||||
(LPBYTE)&pCurrentConfig->pFilter->EnableSecurityFilters, sizeof(DWORD));
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
@@ -3122,86 +3148,154 @@ INetCfgComponentControl_fnApplyRegistryChanges(
|
||||
|
||||
if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
|
||||
{
|
||||
if (This->pCurrentConfig->pDNS)
|
||||
if (pCurrentConfig->pDNS)
|
||||
{
|
||||
RegSetValueExW(hKey, L"RegisterAdapterName", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, sizeof(DWORD));
|
||||
RegSetValueExW(hKey, L"RegistrationEnabled", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, sizeof(DWORD));
|
||||
RegSetValueExW(hKey, L"Domain", 0, REG_SZ, (LPBYTE)This->pCurrentConfig->pDNS->szDomain,
|
||||
(wcslen(This->pCurrentConfig->pDNS->szDomain)+1) * sizeof(WCHAR));
|
||||
}
|
||||
|
||||
if (This->pCurrentConfig->pFilter)
|
||||
#if 0
|
||||
if (pCurrentConfig->pFilter)
|
||||
{
|
||||
RegSetValueExW(hKey, L"TCPAllowedPorts", 0, REG_MULTI_SZ,
|
||||
(LPBYTE)This->pCurrentConfig->pFilter->szTCPAllowedPorts,
|
||||
This->pCurrentConfig->pFilter->TCPSize);
|
||||
|
||||
RegSetValueExW(hKey, L"UDPAllowedPorts", 0, REG_MULTI_SZ,
|
||||
(LPBYTE)This->pCurrentConfig->pFilter->szUDPAllowedPorts,
|
||||
This->pCurrentConfig->pFilter->UDPSize);
|
||||
|
||||
RegSetValueExW(hKey, L"RawIPAllowedProtocols", 0, REG_MULTI_SZ,
|
||||
(LPBYTE)This->pCurrentConfig->pFilter->szRawIPAllowedProtocols,
|
||||
This->pCurrentConfig->pFilter->IPSize);
|
||||
if (pCurrentConfig->pFilter->szTCPAllowedPorts)
|
||||
{
|
||||
RegSetValueExW(hKey, L"TCPAllowedPorts", 0, REG_MULTI_SZ,
|
||||
(LPBYTE)pCurrentConfig->pFilter->szTCPAllowedPorts,
|
||||
pCurrentConfig->pFilter->TCPSize);
|
||||
}
|
||||
if (pCurrentConfig->pFilter->szUDPAllowedPorts)
|
||||
{
|
||||
RegSetValueExW(hKey, L"UDPAllowedPorts", 0, REG_MULTI_SZ,
|
||||
(LPBYTE)pCurrentConfig->pFilter->szUDPAllowedPorts,
|
||||
pCurrentConfig->pFilter->UDPSize);
|
||||
}
|
||||
if (pCurrentConfig->pFilter->szRawIPAllowedProtocols)
|
||||
{
|
||||
RegSetValueExW(hKey, L"RawIPAllowedProtocols", 0, REG_MULTI_SZ,
|
||||
(LPBYTE)pCurrentConfig->pFilter->szRawIPAllowedProtocols,
|
||||
pCurrentConfig->pFilter->IPSize);
|
||||
}
|
||||
}
|
||||
|
||||
RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->DhcpEnabled, sizeof(DWORD));
|
||||
if (This->pCurrentConfig->DhcpEnabled)
|
||||
#endif
|
||||
RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->DhcpEnabled, sizeof(DWORD));
|
||||
if (pCurrentConfig->DhcpEnabled)
|
||||
{
|
||||
RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
|
||||
RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
|
||||
RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
|
||||
RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
|
||||
if (!pOldConfig->DhcpEnabled)
|
||||
{
|
||||
DeleteIPAddress(pOldConfig->Ip->NTEContext);
|
||||
//FIXME
|
||||
// start dhcp client service for the adapter
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pStr = CreateMultiSzString(This->pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
if (!pOldConfig->DhcpEnabled)
|
||||
{
|
||||
RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
DeleteIPAddress(pOldConfig->Ip->NTEContext);
|
||||
//TODO
|
||||
//delete multiple ip addresses when required
|
||||
}
|
||||
|
||||
pStr = CreateMultiSzString(This->pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
//TODO
|
||||
// add multiple ip addresses when required
|
||||
if (AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress), htonl(pCurrentConfig->Ip->u.Subnetmask), pCurrentConfig->Index, &pCurrentConfig->Ip->NTEContext, &NTEInstance) == NO_ERROR)
|
||||
{
|
||||
RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
{
|
||||
RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
}
|
||||
|
||||
pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
{
|
||||
RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
}
|
||||
}
|
||||
|
||||
pStr = CreateMultiSzString(This->pCurrentConfig->Gw, IPADDR, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
if (pOldConfig->Gw)
|
||||
{
|
||||
RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
dwSize = 0;
|
||||
if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
DWORD Index;
|
||||
PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize);
|
||||
if (pIpForwardTable)
|
||||
{
|
||||
if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
|
||||
{
|
||||
for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
|
||||
{
|
||||
if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index)
|
||||
{
|
||||
DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
CoTaskMemFree(pIpForwardTable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pStr = CreateMultiSzString(This->pCurrentConfig->Gw, METRIC, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
if (pCurrentConfig->Gw)
|
||||
{
|
||||
RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
MIB_IPFORWARDROW RouterMib;
|
||||
ZeroMemory(&RouterMib, sizeof(MIB_IPFORWARDROW));
|
||||
|
||||
RouterMib.dwForwardMetric1 = 1;
|
||||
RouterMib.dwForwardIfIndex = pOldConfig->Index;
|
||||
RouterMib.dwForwardNextHop = htonl(pCurrentConfig->Gw->IpAddress);
|
||||
|
||||
//TODO
|
||||
// add multiple gw addresses when required
|
||||
|
||||
if (CreateIpForwardEntry(&RouterMib) == NO_ERROR)
|
||||
{
|
||||
pStr = CreateMultiSzString(pCurrentConfig->Gw, IPADDR, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
{
|
||||
RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
}
|
||||
|
||||
pStr = CreateMultiSzString(pCurrentConfig->Gw, METRIC, &dwSize, FALSE);
|
||||
if(pStr)
|
||||
{
|
||||
RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
|
||||
CoTaskMemFree(pStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR));
|
||||
RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2);
|
||||
}
|
||||
|
||||
if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive)
|
||||
{
|
||||
RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR));
|
||||
}
|
||||
else
|
||||
{
|
||||
pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE);
|
||||
if(pStr)
|
||||
{
|
||||
RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize);
|
||||
RegDeleteValueW(hKey, L"DhcpNameServer");
|
||||
CoTaskMemFree(pStr);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
if (!This->pCurrentConfig->Ns || This->pCurrentConfig->AutoconfigActive)
|
||||
{
|
||||
RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR));
|
||||
}
|
||||
else
|
||||
{
|
||||
pStr = CreateMultiSzString(This->pCurrentConfig->Ns, IPADDR, &dwSize, TRUE);
|
||||
if(pStr)
|
||||
{
|
||||
RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize);
|
||||
RegDeleteValueW(hKey, L"DhcpNameServer");
|
||||
CoTaskMemFree(pStr);
|
||||
}
|
||||
}
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "Íåíàëè÷íî", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Ïîäðîáíîñòè...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Detaily...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "Nicht verfügbar", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -57,13 +57,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 110, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 110, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 110, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 110, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 110, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Detalles...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Détails...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Detil...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -67,13 +67,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Dettagli...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -66,13 +66,13 @@ BEGIN
|
||||
RTEXT "Ikke tilgjengelig", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Detaljer...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "n/d", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Szczegó³y...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Äîïîëíèòåëüíî...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -68,13 +68,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "Po&drobnosti...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -63,13 +63,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -65,13 +65,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Ñêëàä...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -62,13 +62,13 @@ BEGIN
|
||||
RTEXT "N/A", IDC_DETAILSTYPE, 122, 20, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8
|
||||
RTEXT "000.000.000.000", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8
|
||||
|
||||
PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14
|
||||
END
|
||||
|
||||
IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200
|
||||
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
|
||||
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
|
||||
CAPTION "Network Connection Details"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
|
||||
@@ -336,7 +336,7 @@ AddIPAddressToListView(
|
||||
{
|
||||
ZeroMemory(&li, sizeof(LVITEMW));
|
||||
li.mask = LVIF_TEXT;
|
||||
li.iItem = ListView_GetItemCount(hDlgCtrl);
|
||||
li.iItem = Index;
|
||||
li.iSubItem = 0;
|
||||
li.pszText = L"";
|
||||
li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
|
||||
@@ -346,7 +346,7 @@ AddIPAddressToListView(
|
||||
{
|
||||
li.pszText = szBuffer;
|
||||
li.iSubItem = 1;
|
||||
li.iItem = ListView_GetItemCount(hDlgCtrl);
|
||||
li.iItem = Index++;
|
||||
SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
|
||||
}
|
||||
SubIndex++;
|
||||
@@ -365,7 +365,7 @@ InsertItemToListView(
|
||||
ZeroMemory(&li, sizeof(LVITEMW));
|
||||
li.mask = LVIF_TEXT;
|
||||
li.iItem = ListView_GetItemCount(hDlgCtrl);
|
||||
if (LoadStringW(netshell_hInstance, IDS_PHYSICAL_ADDRESS, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
|
||||
if (LoadStringW(netshell_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
|
||||
{
|
||||
li.pszText = szBuffer;
|
||||
return (INT)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
|
||||
@@ -429,9 +429,11 @@ LANStatusUiDetailsDlg(
|
||||
{
|
||||
li.iItem = InsertItemToListView(hDlgCtrl, IDS_PHYSICAL_ADDRESS);
|
||||
if (li.iItem >= 0)
|
||||
if (MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pCurAdapter->Address, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
|
||||
SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
|
||||
|
||||
{
|
||||
swprintf(szBuffer, L"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter->Address[0], pCurAdapter->Address[1],
|
||||
pCurAdapter->Address[2], pCurAdapter->Address[3], pCurAdapter->Address[4], pCurAdapter->Address[5]);
|
||||
SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
|
||||
}
|
||||
li.iItem = InsertItemToListView(hDlgCtrl, IDS_IP_ADDRESS);
|
||||
if (li.iItem >= 0)
|
||||
if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->IpAddressList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
|
||||
@@ -443,10 +445,11 @@ LANStatusUiDetailsDlg(
|
||||
SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
|
||||
|
||||
li.iItem = InsertItemToListView(hDlgCtrl, IDS_DEF_GATEWAY);
|
||||
if (li.iItem >= 0)
|
||||
if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->DhcpServer.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
|
||||
if (li.iItem >= 0 && pCurAdapter->GatewayList.IpAddress.String[0] != '0')
|
||||
{
|
||||
if (MultiByteToWideChar(CP_ACP, 0, pCurAdapter->GatewayList.IpAddress.String, -1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
|
||||
SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
|
||||
|
||||
}
|
||||
#if 0
|
||||
li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_OBTAINED);
|
||||
li.iItem = InsertItemToListView(hDlgCtrl, IDS_LEASE_EXPIRES);
|
||||
@@ -478,6 +481,12 @@ LANStatusUiDetailsDlg(
|
||||
#endif
|
||||
CoTaskMemFree(pAdapterInfo);
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
if (LOWORD(wParam) == IDC_CLOSE)
|
||||
{
|
||||
EndDialog(hwndDlg, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -523,10 +532,12 @@ LANStatusUiAdvancedDlg(
|
||||
SendDlgItemMessageW(hwndDlg, IDC_DETAILSSUBNET, WM_SETTEXT, 0, (LPARAM)szBuffer);
|
||||
|
||||
dwIpAddr = ntohl(pContext->Gateway);
|
||||
swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr),
|
||||
THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
|
||||
SendDlgItemMessageW(hwndDlg, IDC_DETAILSGATEWAY, WM_SETTEXT, 0, (LPARAM)szBuffer);
|
||||
|
||||
if (dwIpAddr)
|
||||
{
|
||||
swprintf(szBuffer, L"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr),
|
||||
THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
|
||||
SendDlgItemMessageW(hwndDlg, IDC_DETAILSGATEWAY, WM_SETTEXT, 0, (LPARAM)szBuffer);
|
||||
}
|
||||
return TRUE;
|
||||
case WM_COMMAND:
|
||||
if (LOWORD(wParam) == IDC_DETAILS)
|
||||
|
||||
+113
-355
@@ -19,11 +19,14 @@
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*
|
||||
* TODO:
|
||||
* - IRunningObjectTable should work interprocess, but currently doesn't.
|
||||
* Native (on Win2k at least) uses an undocumented RPC interface, IROT, to
|
||||
* communicate with RPCSS which contains the table of marshalled data.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "wine/port.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -39,33 +42,25 @@
|
||||
#include "wine/list.h"
|
||||
#include "wine/debug.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "wine/exception.h"
|
||||
|
||||
#include "compobj_private.h"
|
||||
#include "moniker.h"
|
||||
#include "irot.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||
|
||||
/* see MSDN docs for IROTData::GetComparisonData, which states what this
|
||||
* constant is
|
||||
*/
|
||||
* constant is (http://msdn2.microsoft.com/en-us/library/ms693773.aspx) */
|
||||
#define MAX_COMPARISON_DATA 2048
|
||||
|
||||
static LONG WINAPI rpc_filter(EXCEPTION_POINTERS *eptr)
|
||||
{
|
||||
return I_RpcExceptionFilter(eptr->ExceptionRecord->ExceptionCode);
|
||||
}
|
||||
|
||||
/* define the structure of the running object table elements */
|
||||
struct rot_entry
|
||||
{
|
||||
struct list entry;
|
||||
InterfaceData* object; /* marshaled running object*/
|
||||
MonikerComparisonData* moniker_data; /* moniker comparison data that identifies this object */
|
||||
MInterfacePointer* object; /* marshaled running object*/
|
||||
MInterfacePointer* moniker; /* marshaled moniker that identifies this object */
|
||||
MInterfacePointer* moniker_data; /* moniker comparison data that identifies this object */
|
||||
DWORD cookie; /* cookie identifying this object */
|
||||
FILETIME last_modified;
|
||||
IrotContextHandle ctxt_handle;
|
||||
};
|
||||
|
||||
/* define the RunningObjectTableImpl structure */
|
||||
@@ -79,7 +74,16 @@ typedef struct RunningObjectTableImpl
|
||||
} RunningObjectTableImpl;
|
||||
|
||||
static RunningObjectTableImpl* runningObjectTableInstance = NULL;
|
||||
static IrotHandle irot_handle;
|
||||
|
||||
|
||||
|
||||
static inline HRESULT WINAPI
|
||||
IrotRegister(DWORD *cookie)
|
||||
{
|
||||
static LONG last_cookie = 1;
|
||||
*cookie = InterlockedIncrement(&last_cookie);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* define the EnumMonikerImpl structure */
|
||||
typedef struct EnumMonikerImpl
|
||||
@@ -87,79 +91,17 @@ typedef struct EnumMonikerImpl
|
||||
const IEnumMonikerVtbl *lpVtbl;
|
||||
LONG ref;
|
||||
|
||||
InterfaceList *moniker_list;
|
||||
MInterfacePointer **monikers;
|
||||
ULONG moniker_count;
|
||||
ULONG pos;
|
||||
} EnumMonikerImpl;
|
||||
|
||||
|
||||
/* IEnumMoniker Local functions*/
|
||||
static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(InterfaceList *moniker_list,
|
||||
ULONG pos, IEnumMoniker **ppenumMoniker);
|
||||
static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(MInterfacePointer **monikers,
|
||||
ULONG moniker_count, ULONG pos, IEnumMoniker **ppenumMoniker);
|
||||
|
||||
static IrotHandle get_irot_handle(void)
|
||||
{
|
||||
if (!irot_handle)
|
||||
{
|
||||
RPC_STATUS status;
|
||||
RPC_WSTR binding;
|
||||
IrotHandle new_handle;
|
||||
unsigned short ncacn_np[] = IROT_PROTSEQ;
|
||||
unsigned short endpoint[] = IROT_ENDPOINT;
|
||||
status = RpcStringBindingComposeW(NULL, ncacn_np, NULL, endpoint, NULL, &binding);
|
||||
if (status == RPC_S_OK)
|
||||
{
|
||||
status = RpcBindingFromStringBindingW(binding, &new_handle);
|
||||
RpcStringFreeW(&binding);
|
||||
}
|
||||
if (status != RPC_S_OK)
|
||||
return NULL;
|
||||
if (InterlockedCompareExchangePointer(&irot_handle, new_handle, NULL))
|
||||
/* another thread beat us to it */
|
||||
RpcBindingFree(&new_handle);
|
||||
}
|
||||
return irot_handle;
|
||||
}
|
||||
|
||||
static BOOL start_rpcss(void)
|
||||
{
|
||||
PROCESS_INFORMATION pi;
|
||||
STARTUPINFOW si;
|
||||
static WCHAR cmd[6];
|
||||
static const WCHAR rpcss[] = {'r','p','c','s','s',0};
|
||||
BOOL rslt;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
|
||||
ZeroMemory(&si, sizeof(STARTUPINFOA));
|
||||
si.cb = sizeof(STARTUPINFOA);
|
||||
|
||||
memcpy(cmd, rpcss, sizeof(rpcss));
|
||||
|
||||
rslt = CreateProcessW(
|
||||
NULL, /* executable */
|
||||
cmd, /* command line */
|
||||
NULL, /* process security attributes */
|
||||
NULL, /* primary thread security attributes */
|
||||
FALSE, /* inherit handles */
|
||||
0, /* creation flags */
|
||||
NULL, /* use parent's environment */
|
||||
NULL, /* use parent's current directory */
|
||||
&si, /* STARTUPINFO pointer */
|
||||
&pi /* PROCESS_INFORMATION */
|
||||
);
|
||||
|
||||
if (rslt)
|
||||
{
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
Sleep(100);
|
||||
}
|
||||
|
||||
return rslt;
|
||||
}
|
||||
|
||||
static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **stream)
|
||||
static HRESULT create_stream_on_mip_ro(const MInterfacePointer *mip, IStream **stream)
|
||||
{
|
||||
HGLOBAL hglobal = GlobalAlloc(0, mip->ulCntData);
|
||||
void *pv = GlobalLock(hglobal);
|
||||
@@ -170,33 +112,7 @@ static HRESULT create_stream_on_mip_ro(const InterfaceData *mip, IStream **strea
|
||||
|
||||
static inline void rot_entry_delete(struct rot_entry *rot_entry)
|
||||
{
|
||||
if (rot_entry->cookie)
|
||||
{
|
||||
InterfaceData *object = NULL;
|
||||
InterfaceData *moniker = NULL;
|
||||
__TRY
|
||||
{
|
||||
IrotRevoke(get_irot_handle(), rot_entry->cookie,
|
||||
&rot_entry->ctxt_handle, &object, &moniker);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
}
|
||||
__ENDTRY
|
||||
MIDL_user_free(object);
|
||||
if (moniker)
|
||||
{
|
||||
IStream *stream;
|
||||
HRESULT hr;
|
||||
hr = create_stream_on_mip_ro(moniker, &stream);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
CoReleaseMarshalData(stream);
|
||||
IUnknown_Release(stream);
|
||||
}
|
||||
}
|
||||
MIDL_user_free(moniker);
|
||||
}
|
||||
/* FIXME: revoke entry from rpcss's copy of the ROT */
|
||||
if (rot_entry->object)
|
||||
{
|
||||
IStream *stream;
|
||||
@@ -208,13 +124,25 @@ static inline void rot_entry_delete(struct rot_entry *rot_entry)
|
||||
IUnknown_Release(stream);
|
||||
}
|
||||
}
|
||||
if (rot_entry->moniker)
|
||||
{
|
||||
IStream *stream;
|
||||
HRESULT hr;
|
||||
hr = create_stream_on_mip_ro(rot_entry->moniker, &stream);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
CoReleaseMarshalData(stream);
|
||||
IUnknown_Release(stream);
|
||||
}
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, rot_entry->object);
|
||||
HeapFree(GetProcessHeap(), 0, rot_entry->moniker);
|
||||
HeapFree(GetProcessHeap(), 0, rot_entry->moniker_data);
|
||||
HeapFree(GetProcessHeap(), 0, rot_entry);
|
||||
}
|
||||
|
||||
/* moniker_data must be freed with HeapFree when no longer in use */
|
||||
static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparisonData **moniker_data)
|
||||
static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MInterfacePointer **moniker_data)
|
||||
{
|
||||
HRESULT hr;
|
||||
IROTData *pROTData = NULL;
|
||||
@@ -222,14 +150,8 @@ static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparison
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
ULONG size = MAX_COMPARISON_DATA;
|
||||
*moniker_data = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MonikerComparisonData, abData[size]));
|
||||
if (!*moniker_data)
|
||||
{
|
||||
IROTData_Release(pROTData);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
*moniker_data = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MInterfacePointer, abData[size]));
|
||||
hr = IROTData_GetComparisonData(pROTData, (*moniker_data)->abData, size, &size);
|
||||
IROTData_Release(pROTData);
|
||||
if (hr != S_OK)
|
||||
{
|
||||
ERR("Failed to copy comparison data into buffer, hr = 0x%08x\n", hr);
|
||||
@@ -263,7 +185,7 @@ static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparison
|
||||
|
||||
len = strlenW(pszDisplayName);
|
||||
*moniker_data = HeapAlloc(GetProcessHeap(), 0,
|
||||
FIELD_OFFSET(MonikerComparisonData, abData[sizeof(CLSID) + (len+1)*sizeof(WCHAR)]));
|
||||
FIELD_OFFSET(MInterfacePointer, abData[sizeof(CLSID) + (len+1)*sizeof(WCHAR)]));
|
||||
if (!*moniker_data)
|
||||
{
|
||||
CoTaskMemFree(pszDisplayName);
|
||||
@@ -273,7 +195,6 @@ static HRESULT get_moniker_comparison_data(IMoniker *pMoniker, MonikerComparison
|
||||
|
||||
memcpy(&(*moniker_data)->abData[0], &clsid, sizeof(clsid));
|
||||
memcpy(&(*moniker_data)->abData[sizeof(clsid)], pszDisplayName, (len+1)*sizeof(WCHAR));
|
||||
CoTaskMemFree(pszDisplayName);
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
@@ -346,7 +267,6 @@ static HRESULT WINAPI
|
||||
RunningObjectTableImpl_Destroy(void)
|
||||
{
|
||||
struct list *cursor, *cursor2;
|
||||
IrotHandle old_handle;
|
||||
|
||||
TRACE("()\n");
|
||||
|
||||
@@ -368,11 +288,6 @@ RunningObjectTableImpl_Destroy(void)
|
||||
HeapFree(GetProcessHeap(),0,runningObjectTableInstance);
|
||||
runningObjectTableInstance = NULL;
|
||||
|
||||
old_handle = irot_handle;
|
||||
irot_handle = NULL;
|
||||
if (old_handle)
|
||||
RpcBindingFree(&old_handle);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -426,7 +341,6 @@ RunningObjectTableImpl_Register(IRunningObjectTable* iface, DWORD grfFlags,
|
||||
IStream *pStream = NULL;
|
||||
DWORD mshlflags;
|
||||
IBindCtx *pbc;
|
||||
InterfaceData *moniker = NULL;
|
||||
|
||||
TRACE("(%p,%d,%p,%p,%p)\n",This,grfFlags,punkObject,pmkObjectName,pdwRegister);
|
||||
|
||||
@@ -464,7 +378,7 @@ RunningObjectTableImpl_Register(IRunningObjectTable* iface, DWORD grfFlags,
|
||||
const void *pv = GlobalLock(hglobal);
|
||||
rot_entry->object = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MInterfacePointer, abData[size]));
|
||||
rot_entry->object->ulCntData = size;
|
||||
memcpy(rot_entry->object->abData, pv, size);
|
||||
memcpy(&rot_entry->object->abData, pv, size);
|
||||
GlobalUnlock(hglobal);
|
||||
}
|
||||
}
|
||||
@@ -528,9 +442,9 @@ RunningObjectTableImpl_Register(IRunningObjectTable* iface, DWORD grfFlags,
|
||||
{
|
||||
SIZE_T size = GlobalSize(hglobal);
|
||||
const void *pv = GlobalLock(hglobal);
|
||||
moniker = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(InterfaceData, abData[size]));
|
||||
moniker->ulCntData = size;
|
||||
memcpy(moniker->abData, pv, size);
|
||||
rot_entry->moniker = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(MInterfacePointer, abData[size]));
|
||||
rot_entry->moniker->ulCntData = size;
|
||||
memcpy(&rot_entry->moniker->abData, pv, size);
|
||||
GlobalUnlock(hglobal);
|
||||
}
|
||||
}
|
||||
@@ -538,35 +452,13 @@ RunningObjectTableImpl_Register(IRunningObjectTable* iface, DWORD grfFlags,
|
||||
IMoniker_Release(pmkObjectName);
|
||||
if (hr != S_OK)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, moniker);
|
||||
rot_entry_delete(rot_entry);
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
__TRY
|
||||
{
|
||||
hr = IrotRegister(get_irot_handle(), rot_entry->moniker_data,
|
||||
rot_entry->object, moniker,
|
||||
&rot_entry->last_modified, grfFlags,
|
||||
&rot_entry->cookie, &rot_entry->ctxt_handle);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||
}
|
||||
__ENDTRY
|
||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||
{
|
||||
if (start_rpcss())
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, moniker);
|
||||
if (FAILED(hr))
|
||||
/* FIXME: not the right signature of IrotRegister function */
|
||||
hr = IrotRegister(&rot_entry->cookie);
|
||||
if (hr != S_OK)
|
||||
{
|
||||
rot_entry_delete(rot_entry);
|
||||
return hr;
|
||||
@@ -576,6 +468,7 @@ RunningObjectTableImpl_Register(IRunningObjectTable* iface, DWORD grfFlags,
|
||||
*pdwRegister = rot_entry->cookie;
|
||||
|
||||
EnterCriticalSection(&This->lock);
|
||||
/* FIXME: see if object was registered before and return MK_S_MONIKERALREADYREGISTERED */
|
||||
list_add_tail(&This->rot, &rot_entry->entry);
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
@@ -623,9 +516,9 @@ static HRESULT WINAPI
|
||||
RunningObjectTableImpl_IsRunning( IRunningObjectTable* iface, IMoniker *pmkObjectName)
|
||||
{
|
||||
RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
|
||||
MonikerComparisonData *moniker_data;
|
||||
MInterfacePointer *moniker_data;
|
||||
HRESULT hr;
|
||||
const struct rot_entry *rot_entry;
|
||||
struct rot_entry *rot_entry;
|
||||
|
||||
TRACE("(%p,%p)\n",This,pmkObjectName);
|
||||
|
||||
@@ -639,10 +532,10 @@ RunningObjectTableImpl_IsRunning( IRunningObjectTable* iface, IMoniker *pmkObjec
|
||||
|
||||
hr = S_FALSE;
|
||||
EnterCriticalSection(&This->lock);
|
||||
LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, const struct rot_entry, entry)
|
||||
LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, struct rot_entry, entry)
|
||||
{
|
||||
if ((rot_entry->moniker_data->ulCntData == moniker_data->ulCntData) &&
|
||||
!memcmp(moniker_data->abData, rot_entry->moniker_data->abData, moniker_data->ulCntData))
|
||||
!memcmp(&moniker_data->abData, &rot_entry->moniker_data->abData, moniker_data->ulCntData))
|
||||
{
|
||||
hr = S_OK;
|
||||
break;
|
||||
@@ -650,27 +543,7 @@ RunningObjectTableImpl_IsRunning( IRunningObjectTable* iface, IMoniker *pmkObjec
|
||||
}
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
if (hr == S_FALSE)
|
||||
{
|
||||
while (TRUE)
|
||||
{
|
||||
__TRY
|
||||
{
|
||||
hr = IrotIsRunning(get_irot_handle(), moniker_data);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||
}
|
||||
__ENDTRY
|
||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||
{
|
||||
if (start_rpcss())
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* FIXME: call IrotIsRunning */
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, moniker_data);
|
||||
|
||||
@@ -689,9 +562,7 @@ RunningObjectTableImpl_GetObject( IRunningObjectTable* iface,
|
||||
IMoniker *pmkObjectName, IUnknown **ppunkObject)
|
||||
{
|
||||
RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
|
||||
MonikerComparisonData *moniker_data;
|
||||
InterfaceData *object = NULL;
|
||||
IrotCookie cookie;
|
||||
MInterfacePointer *moniker_data;
|
||||
HRESULT hr;
|
||||
struct rot_entry *rot_entry;
|
||||
|
||||
@@ -714,7 +585,7 @@ RunningObjectTableImpl_GetObject( IRunningObjectTable* iface,
|
||||
LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, struct rot_entry, entry)
|
||||
{
|
||||
if ((rot_entry->moniker_data->ulCntData == moniker_data->ulCntData) &&
|
||||
!memcmp(moniker_data->abData, rot_entry->moniker_data->abData, moniker_data->ulCntData))
|
||||
!memcmp(&moniker_data->abData, &rot_entry->moniker_data->abData, moniker_data->ulCntData))
|
||||
{
|
||||
IStream *pStream;
|
||||
hr = create_stream_on_mip_ro(rot_entry->object, &pStream);
|
||||
@@ -732,39 +603,9 @@ RunningObjectTableImpl_GetObject( IRunningObjectTable* iface,
|
||||
}
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
TRACE("moniker unavailable locally, calling SCM\n");
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
__TRY
|
||||
{
|
||||
hr = IrotGetObject(get_irot_handle(), moniker_data, &object, &cookie);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||
}
|
||||
__ENDTRY
|
||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||
{
|
||||
if (start_rpcss())
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
IStream *pStream;
|
||||
hr = create_stream_on_mip_ro(object, &pStream);
|
||||
if (hr == S_OK)
|
||||
{
|
||||
hr = CoUnmarshalInterface(pStream, &IID_IUnknown, (void **)ppunkObject);
|
||||
IStream_Release(pStream);
|
||||
}
|
||||
}
|
||||
else
|
||||
WARN("Moniker unavailable, IrotGetObject returned 0x%08x\n", hr);
|
||||
/* FIXME: call IrotGetObject */
|
||||
WARN("Moniker unavailable - app may require interprocess running object table\n");
|
||||
hr = MK_E_UNAVAILABLE;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, moniker_data);
|
||||
|
||||
@@ -784,7 +625,6 @@ RunningObjectTableImpl_NoteChangeTime(IRunningObjectTable* iface,
|
||||
{
|
||||
RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
|
||||
struct rot_entry *rot_entry;
|
||||
HRESULT hr = E_INVALIDARG;
|
||||
|
||||
TRACE("(%p,%d,%p)\n",This,dwRegister,pfiletime);
|
||||
|
||||
@@ -795,34 +635,14 @@ RunningObjectTableImpl_NoteChangeTime(IRunningObjectTable* iface,
|
||||
{
|
||||
rot_entry->last_modified = *pfiletime;
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
__TRY
|
||||
{
|
||||
hr = IrotNoteChangeTime(get_irot_handle(), dwRegister, pfiletime);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||
}
|
||||
__ENDTRY
|
||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||
{
|
||||
if (start_rpcss())
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
goto done;
|
||||
return S_OK;
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
done:
|
||||
TRACE("-- 0x08%x\n", hr);
|
||||
return hr;
|
||||
/* FIXME: call IrotNoteChangeTime */
|
||||
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -838,8 +658,8 @@ RunningObjectTableImpl_GetTimeOfLastChange(IRunningObjectTable* iface,
|
||||
{
|
||||
HRESULT hr = MK_E_UNAVAILABLE;
|
||||
RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
|
||||
MonikerComparisonData *moniker_data;
|
||||
const struct rot_entry *rot_entry;
|
||||
MInterfacePointer *moniker_data;
|
||||
struct rot_entry *rot_entry;
|
||||
|
||||
TRACE("(%p,%p,%p)\n",This,pmkObjectName,pfiletime);
|
||||
|
||||
@@ -857,10 +677,10 @@ RunningObjectTableImpl_GetTimeOfLastChange(IRunningObjectTable* iface,
|
||||
hr = MK_E_UNAVAILABLE;
|
||||
|
||||
EnterCriticalSection(&This->lock);
|
||||
LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, const struct rot_entry, entry)
|
||||
LIST_FOR_EACH_ENTRY(rot_entry, &This->rot, struct rot_entry, entry)
|
||||
{
|
||||
if ((rot_entry->moniker_data->ulCntData == moniker_data->ulCntData) &&
|
||||
!memcmp(moniker_data->abData, rot_entry->moniker_data->abData, moniker_data->ulCntData))
|
||||
!memcmp(&moniker_data->abData, &rot_entry->moniker_data->abData, moniker_data->ulCntData))
|
||||
{
|
||||
*pfiletime = rot_entry->last_modified;
|
||||
hr = S_OK;
|
||||
@@ -869,31 +689,9 @@ RunningObjectTableImpl_GetTimeOfLastChange(IRunningObjectTable* iface,
|
||||
}
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
if (hr != S_OK)
|
||||
{
|
||||
while (TRUE)
|
||||
{
|
||||
__TRY
|
||||
{
|
||||
hr = IrotGetTimeOfLastChange(get_irot_handle(), moniker_data, pfiletime);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||
}
|
||||
__ENDTRY
|
||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||
{
|
||||
if (start_rpcss())
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* FIXME: if (hr != S_OK) call IrotGetTimeOfLastChange */
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, moniker_data);
|
||||
|
||||
TRACE("-- 0x%08x\n", hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -907,36 +705,33 @@ static HRESULT WINAPI
|
||||
RunningObjectTableImpl_EnumRunning(IRunningObjectTable* iface,
|
||||
IEnumMoniker **ppenumMoniker)
|
||||
{
|
||||
RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
|
||||
InterfaceList *interface_list = NULL;
|
||||
HRESULT hr;
|
||||
RunningObjectTableImpl *This = (RunningObjectTableImpl *)iface;
|
||||
MInterfacePointer **monikers;
|
||||
ULONG moniker_count = 0;
|
||||
const struct rot_entry *rot_entry;
|
||||
ULONG i = 0;
|
||||
|
||||
TRACE("(%p, %p)\n", This, ppenumMoniker);
|
||||
EnterCriticalSection(&This->lock);
|
||||
|
||||
*ppenumMoniker = NULL;
|
||||
LIST_FOR_EACH_ENTRY( rot_entry, &This->rot, const struct rot_entry, entry )
|
||||
moniker_count++;
|
||||
|
||||
while (TRUE)
|
||||
monikers = HeapAlloc(GetProcessHeap(), 0, moniker_count * sizeof(*monikers));
|
||||
|
||||
LIST_FOR_EACH_ENTRY( rot_entry, &This->rot, const struct rot_entry, entry )
|
||||
{
|
||||
__TRY
|
||||
{
|
||||
hr = IrotEnumRunning(get_irot_handle(), &interface_list);
|
||||
}
|
||||
__EXCEPT(rpc_filter)
|
||||
{
|
||||
hr = HRESULT_FROM_WIN32(GetExceptionCode());
|
||||
}
|
||||
__ENDTRY
|
||||
if (hr == HRESULT_FROM_WIN32(RPC_S_SERVER_UNAVAILABLE))
|
||||
{
|
||||
if (start_rpcss())
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
SIZE_T size = FIELD_OFFSET(MInterfacePointer, abData[rot_entry->moniker->ulCntData]);
|
||||
monikers[i] = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
memcpy(monikers[i], rot_entry->moniker, size);
|
||||
i++;
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
hr = EnumMonikerImpl_CreateEnumROTMoniker(interface_list,
|
||||
0, ppenumMoniker);
|
||||
LeaveCriticalSection(&This->lock);
|
||||
|
||||
/* FIXME: call IrotEnumRunning and append data */
|
||||
|
||||
hr = EnumMonikerImpl_CreateEnumROTMoniker(monikers, moniker_count, 0, ppenumMoniker);
|
||||
|
||||
return hr;
|
||||
}
|
||||
@@ -972,9 +767,9 @@ HRESULT WINAPI RunningObjectTableImpl_Initialize(void)
|
||||
/* initialize the virtual table function */
|
||||
runningObjectTableInstance->lpVtbl = &VT_RunningObjectTableImpl;
|
||||
|
||||
/* the initial reference is set to "1" so that it isn't destroyed after its
|
||||
* first use until the process is destroyed, as the running object table is
|
||||
* a process-wide cache of a global table */
|
||||
/* the initial reference is set to "1" ! because if set to "0" it will be not practis when */
|
||||
/* the ROT referred many times not in the same time (all the objects in the ROT will */
|
||||
/* be removed every time the ROT is removed ) */
|
||||
runningObjectTableInstance->ref = 1;
|
||||
|
||||
list_init(&runningObjectTableInstance->rot);
|
||||
@@ -1078,21 +873,6 @@ static HRESULT get_moniker_for_progid_display_name(LPBC pbc,
|
||||
IParseDisplayName *pdn;
|
||||
hr = IMoniker_BindToObject(class_moniker, pbc, NULL,
|
||||
&IID_IParseDisplayName, (void **)&pdn);
|
||||
/* fallback to using IClassFactory to get IParseDisplayName -
|
||||
* adsldp.dll depends on this */
|
||||
if (FAILED(hr))
|
||||
{
|
||||
IClassFactory *pcf;
|
||||
hr = IMoniker_BindToObject(class_moniker, pbc, NULL,
|
||||
&IID_IClassFactory, (void **)&pcf);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = IClassFactory_CreateInstance(pcf, NULL,
|
||||
&IID_IParseDisplayName,
|
||||
(void **)&pdn);
|
||||
IClassFactory_Release(pcf);
|
||||
}
|
||||
}
|
||||
IMoniker_Release(class_moniker);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
@@ -1211,9 +991,9 @@ HRESULT WINAPI GetClassFile(LPCOLESTR filePathName,CLSID *pclsid)
|
||||
|
||||
return res;
|
||||
}
|
||||
/* If the file is not a storage object then attempt to match various bits in the file against a
|
||||
pattern in the registry. This case is not frequently used, so I present only the pseudocode for
|
||||
this case.
|
||||
/* if the file is not a storage object then attemps to match various bits in the file against a
|
||||
pattern in the registry. this case is not frequently used ! so I present only the psodocode for
|
||||
this case
|
||||
|
||||
for(i=0;i<nFileTypes;i++)
|
||||
|
||||
@@ -1240,7 +1020,7 @@ HRESULT WINAPI GetClassFile(LPCOLESTR filePathName,CLSID *pclsid)
|
||||
nbElm=FileMonikerImpl_DecomposePath(filePathName,&pathDec);
|
||||
absFile=pathDec[nbElm-1];
|
||||
|
||||
/* failed if the path represents a directory and not an absolute file name*/
|
||||
/* failed if the path represente a directory and not an absolute file name*/
|
||||
if (!lstrcmpW(absFile, bkslashW))
|
||||
return MK_E_INVALIDEXTENSION;
|
||||
|
||||
@@ -1335,9 +1115,9 @@ static ULONG WINAPI EnumMonikerImpl_Release(IEnumMoniker* iface)
|
||||
|
||||
TRACE("(%p) Deleting\n",This);
|
||||
|
||||
for (i = 0; i < This->moniker_list->size; i++)
|
||||
HeapFree(GetProcessHeap(), 0, This->moniker_list->interfaces[i]);
|
||||
HeapFree(GetProcessHeap(), 0, This->moniker_list);
|
||||
for (i = 0; i < This->moniker_count; i++)
|
||||
HeapFree(GetProcessHeap(), 0, This->monikers[i]);
|
||||
HeapFree(GetProcessHeap(), 0, This->monikers);
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
||||
@@ -1352,13 +1132,13 @@ static HRESULT WINAPI EnumMonikerImpl_Next(IEnumMoniker* iface, ULONG celt, IM
|
||||
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
TRACE("(%p) TabCurrentPos %d Tablastindx %d\n", This, This->pos, This->moniker_list->size);
|
||||
TRACE("(%p) TabCurrentPos %d Tablastindx %d\n", This, This->pos, This->moniker_count);
|
||||
|
||||
/* retrieve the requested number of moniker from the current position */
|
||||
for(i = 0; (This->pos < This->moniker_list->size) && (i < celt); i++)
|
||||
for(i = 0; (This->pos < This->moniker_count) && (i < celt); i++)
|
||||
{
|
||||
IStream *stream;
|
||||
hr = create_stream_on_mip_ro(This->moniker_list->interfaces[This->pos++], &stream);
|
||||
hr = create_stream_on_mip_ro(This->monikers[This->pos++], &stream);
|
||||
if (hr != S_OK) break;
|
||||
hr = CoUnmarshalInterface(stream, &IID_IMoniker, (void **)&rgelt[i]);
|
||||
IStream_Release(stream);
|
||||
@@ -1387,7 +1167,7 @@ static HRESULT WINAPI EnumMonikerImpl_Skip(IEnumMoniker* iface, ULONG celt)
|
||||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
if (This->pos + celt >= This->moniker_list->size)
|
||||
if (This->pos + celt >= This->moniker_count)
|
||||
return S_FALSE;
|
||||
|
||||
This->pos += celt;
|
||||
@@ -1415,35 +1195,21 @@ static HRESULT WINAPI EnumMonikerImpl_Reset(IEnumMoniker* iface)
|
||||
static HRESULT WINAPI EnumMonikerImpl_Clone(IEnumMoniker* iface, IEnumMoniker ** ppenum)
|
||||
{
|
||||
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
|
||||
InterfaceList *moniker_list;
|
||||
MInterfacePointer **monikers = HeapAlloc(GetProcessHeap(), 0, sizeof(*monikers)*This->moniker_count);
|
||||
ULONG i;
|
||||
|
||||
TRACE("(%p)\n",This);
|
||||
|
||||
*ppenum = NULL;
|
||||
|
||||
moniker_list = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(InterfaceList, interfaces[This->moniker_list->size]));
|
||||
if (!moniker_list)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
moniker_list->size = This->moniker_list->size;
|
||||
for (i = 0; i < This->moniker_list->size; i++)
|
||||
for (i = 0; i < This->moniker_count; i++)
|
||||
{
|
||||
SIZE_T size = FIELD_OFFSET(InterfaceData, abData[This->moniker_list->interfaces[i]->ulCntData]);
|
||||
moniker_list->interfaces[i] = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
if (!moniker_list->interfaces[i])
|
||||
{
|
||||
ULONG end = i;
|
||||
for (i = 0; i < end; i++)
|
||||
HeapFree(GetProcessHeap(), 0, moniker_list->interfaces[i]);
|
||||
HeapFree(GetProcessHeap(), 0, moniker_list);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
memcpy(moniker_list->interfaces[i], This->moniker_list->interfaces[i], size);
|
||||
SIZE_T size = FIELD_OFFSET(MInterfacePointer, abData[This->monikers[i]->ulCntData]);
|
||||
monikers[i] = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
memcpy(monikers[i], This->monikers[i], size);
|
||||
}
|
||||
|
||||
/* copy the enum structure */
|
||||
return EnumMonikerImpl_CreateEnumROTMoniker(moniker_list, This->pos, ppenum);
|
||||
return EnumMonikerImpl_CreateEnumROTMoniker(monikers, This->moniker_count,
|
||||
This->pos, ppenum);
|
||||
}
|
||||
|
||||
/* Virtual function table for the IEnumMoniker class. */
|
||||
@@ -1463,7 +1229,8 @@ static const IEnumMonikerVtbl VT_EnumMonikerImpl =
|
||||
* Used by EnumRunning to create the structure and EnumClone
|
||||
* to copy the structure
|
||||
*/
|
||||
static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(InterfaceList *moniker_list,
|
||||
static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(MInterfacePointer **monikers,
|
||||
ULONG moniker_count,
|
||||
ULONG current_pos,
|
||||
IEnumMoniker **ppenumMoniker)
|
||||
{
|
||||
@@ -1483,7 +1250,8 @@ static HRESULT WINAPI EnumMonikerImpl_CreateEnumROTMoniker(InterfaceList *monike
|
||||
/* the initial reference is set to "1" */
|
||||
This->ref = 1; /* set the ref count to one */
|
||||
This->pos = current_pos; /* Set the list start posn */
|
||||
This->moniker_list = moniker_list;
|
||||
This->moniker_count = moniker_count; /* Need the same size table as ROT */
|
||||
This->monikers = monikers;
|
||||
|
||||
*ppenumMoniker = (IEnumMoniker*)This;
|
||||
|
||||
@@ -1659,13 +1427,3 @@ HRESULT MonikerMarshal_Create(IMoniker *inner, IUnknown **outer)
|
||||
*outer = (IUnknown *)&This->lpVtbl;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void * __RPC_USER MIDL_user_allocate(size_t size)
|
||||
{
|
||||
return HeapAlloc(GetProcessHeap(), 0, size);
|
||||
}
|
||||
|
||||
void __RPC_USER MIDL_user_free(void *p)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, p);
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
<library>advapi32</library>
|
||||
<library>user32</library>
|
||||
<library>gdi32</library>
|
||||
<library>ole32_irot_client</library>
|
||||
<library>ole32_proxy</library>
|
||||
<library>rpcrt4</library>
|
||||
<library>kernel32</library>
|
||||
|
||||
@@ -678,7 +678,7 @@ SH_ShowDriveProperties(WCHAR * drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *
|
||||
PROPSHEETHEADERW psh;
|
||||
BOOL ret;
|
||||
UINT i;
|
||||
WCHAR szName[MAX_PATH];
|
||||
WCHAR szName[MAX_PATH+6];
|
||||
DWORD dwMaxComponent, dwFileSysFlags;
|
||||
IDataObject * pDataObj = NULL;
|
||||
|
||||
@@ -700,8 +700,8 @@ SH_ShowDriveProperties(WCHAR * drive, LPCITEMIDLIST pidlFolder, LPCITEMIDLIST *
|
||||
/* FIXME
|
||||
* check if disk is a really a local hdd
|
||||
*/
|
||||
i = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szName, sizeof(szName)/sizeof(WCHAR));
|
||||
if (i > 0 && i < (sizeof(szName)/sizeof(WCHAR)) + 6)
|
||||
i = LoadStringW(shell32_hInstance, IDS_DRIVE_FIXED, szName, sizeof(szName)/sizeof(WCHAR)-6);
|
||||
if (i > 0 && i < (sizeof(szName)/sizeof(WCHAR)) - 6)
|
||||
{
|
||||
szName[i] = L' ';
|
||||
szName[i+1] = L'(';
|
||||
@@ -929,6 +929,8 @@ InitializeFormatDriveDlg(HWND hwndDlg, PFORMAT_DRIVE_CONTEXT pContext)
|
||||
HWND hDlgCtrl;
|
||||
|
||||
Length = GetWindowTextW(hwndDlg, szText, sizeof(szText)/sizeof(WCHAR));
|
||||
if (Length < 0)
|
||||
Length = 0;
|
||||
szDrive[0] = pContext->Drive + L'A';
|
||||
if (GetVolumeInformationW(szDrive, &szText[Length+1], (sizeof(szText)/sizeof(WCHAR))- Length - 2, &dwSerial, &dwMaxComp, &dwFileSys, szFs, sizeof(szFs)/sizeof(WCHAR)))
|
||||
{
|
||||
|
||||
@@ -97,8 +97,8 @@ BOOL HasItemWithCLSID(IEnumIDList *iface, LPITEMIDLIST pidl)
|
||||
|
||||
while(pCur)
|
||||
{
|
||||
REFIID curid = _ILGetGUIDPointer(pCur->pidl);
|
||||
if (IsEqualIID(curid, refid))
|
||||
LPGUID curid = _ILGetGUIDPointer(pCur->pidl);
|
||||
if (curid && IsEqualGUID(curid, refid))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -424,8 +424,8 @@ static HRESULT WINAPI ISF_AdminTools_fnGetDisplayNameOf (IShellFolder2 * iface,
|
||||
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
|
||||
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
|
||||
wcscpy(pszPath, This->szTarget);
|
||||
else
|
||||
HCR_GetClassNameW(&CLSID_AdminFolderShortcut, pszPath, MAX_PATH);
|
||||
else if (!HCR_GetClassNameW(&CLSID_AdminFolderShortcut, pszPath, MAX_PATH))
|
||||
hr = E_FAIL;
|
||||
}
|
||||
else if (_ILIsPidlSimple(pidl))
|
||||
{
|
||||
@@ -436,12 +436,23 @@ static HRESULT WINAPI ISF_AdminTools_fnGetDisplayNameOf (IShellFolder2 * iface,
|
||||
wcscpy(pszPath, This->szTarget);
|
||||
pOffset = PathAddBackslashW(pszPath);
|
||||
if (pOffset)
|
||||
_ILSimpleGetTextW(pidl, pOffset, MAX_PATH + 1 - (pOffset - pszPath));
|
||||
{
|
||||
if (!_ILSimpleGetTextW(pidl, pOffset, MAX_PATH + 1 - (pOffset - pszPath)))
|
||||
hr = E_FAIL;
|
||||
}
|
||||
else
|
||||
hr = E_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
_ILSimpleGetTextW(pidl, pszPath, MAX_PATH + 1);
|
||||
}
|
||||
{
|
||||
if (_ILSimpleGetTextW(pidl, pszPath, MAX_PATH + 1))
|
||||
{
|
||||
if (SHELL_FS_HideExtension(pszPath))
|
||||
PathRemoveExtensionW(pszPath);
|
||||
}
|
||||
else
|
||||
hr = E_FAIL;
|
||||
}
|
||||
}
|
||||
else if (_ILIsSpecialFolder(pidl))
|
||||
{
|
||||
@@ -449,10 +460,10 @@ static HRESULT WINAPI ISF_AdminTools_fnGetDisplayNameOf (IShellFolder2 * iface,
|
||||
|
||||
if (bSimplePidl)
|
||||
{
|
||||
_ILSimpleGetTextW(pidl, pszPath, MAX_PATH);
|
||||
}
|
||||
|
||||
if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl)
|
||||
if (!_ILSimpleGetTextW(pidl, pszPath, MAX_PATH))
|
||||
hr = E_FAIL;
|
||||
}
|
||||
else if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
@@ -473,11 +484,11 @@ static HRESULT WINAPI ISF_AdminTools_fnGetDisplayNameOf (IShellFolder2 * iface,
|
||||
{
|
||||
strRet->uType = STRRET_WSTR;
|
||||
strRet->u.pOleStr = pszPath;
|
||||
TRACE ("-- (%p)->(%s,0x%08x)\n", This, debugstr_w(strRet->u.pOleStr), hr);
|
||||
}
|
||||
else
|
||||
CoTaskMemFree(pszPath);
|
||||
|
||||
TRACE ("-- (%p)->(%s,0x%08x)\n", This, debugstr_w(strRet->u.pOleStr), hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
@@ -1218,7 +1218,7 @@ InitializeBitBucketDlg(HWND hwndDlg, WCHAR DefaultDrive)
|
||||
li.iSubItem = 0;
|
||||
li.pszText = szVolume;
|
||||
li.iItem = itemCount;
|
||||
(void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMN, 0, (LPARAM)&li);
|
||||
(void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
|
||||
if (GetDiskFreeSpaceExW(szDrive, &FreeBytesAvailable , &TotalNumberOfBytes, &TotalNumberOfFreeBytes))
|
||||
{
|
||||
if (StrFormatByteSizeW(TotalNumberOfFreeBytes.QuadPart, szVolume, sizeof(szVolume) / sizeof(WCHAR)))
|
||||
@@ -1383,11 +1383,17 @@ BitBucketDlg(
|
||||
PDRIVE_ITEM_CONTEXT pItem;
|
||||
BOOL bSuccess;
|
||||
UINT uResult;
|
||||
PROPSHEETPAGE * page;
|
||||
DWORD dwStyle;
|
||||
|
||||
switch(uMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
InitializeBitBucketDlg(hwndDlg, (WCHAR)lParam);
|
||||
case WM_INITDIALOG:
|
||||
page = (PROPSHEETPAGE*)lParam;
|
||||
InitializeBitBucketDlg(hwndDlg, (WCHAR)page->lParam);
|
||||
dwStyle = (DWORD) SendDlgItemMessage(hwndDlg, 14000, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
|
||||
dwStyle = dwStyle | LVS_EX_FULLROWSELECT;
|
||||
SendDlgItemMessage(hwndDlg, 14000, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
|
||||
if (GetDlgCtrlID((HWND)wParam) != 14000)
|
||||
{
|
||||
SetFocus(GetDlgItem(hwndDlg, 14000));
|
||||
|
||||
@@ -835,6 +835,8 @@ static HRESULT ShellView_OpenSelectedItems(IShellViewImpl * This)
|
||||
static UINT CF_IDLIST = 0;
|
||||
HRESULT hr;
|
||||
IDataObject* selection;
|
||||
IContextMenu * cm;
|
||||
HMENU hmenu;
|
||||
FORMATETC fetc;
|
||||
STGMEDIUM stgm;
|
||||
LPIDA pIDList;
|
||||
@@ -843,14 +845,68 @@ static HRESULT ShellView_OpenSelectedItems(IShellViewImpl * This)
|
||||
LPCWSTR parent_dir = NULL;
|
||||
SFGAOF attribs;
|
||||
int i;
|
||||
CMINVOKECOMMANDINFOEX ici;
|
||||
MENUITEMINFOW info;
|
||||
|
||||
if (0 == ShellView_GetSelections(This))
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl,
|
||||
(LPCITEMIDLIST*)This->apidl, &IID_IContextMenu,
|
||||
0, (LPVOID *)&cm);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hmenu = CreatePopupMenu();
|
||||
if (hmenu)
|
||||
{
|
||||
if (SUCCEEDED(IContextMenu_QueryContextMenu( cm, hmenu, 0, 0x20, 0x7fff, CMF_DEFAULTONLY)))
|
||||
{
|
||||
INT def = -1, n = GetMenuItemCount(hmenu);
|
||||
|
||||
for ( i = 0; i < n; i++ )
|
||||
{
|
||||
memset( &info, 0, sizeof info );
|
||||
info.cbSize = sizeof info;
|
||||
info.fMask = MIIM_FTYPE | MIIM_STATE | MIIM_ID;
|
||||
if (GetMenuItemInfoW( hmenu, i, TRUE, &info))
|
||||
{
|
||||
if (info.fState & MFS_DEFAULT)
|
||||
{
|
||||
def = info.wID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (def != -1)
|
||||
{
|
||||
memset( &ici, 0, sizeof ici );
|
||||
ici.cbSize = sizeof ici;
|
||||
ici.lpVerb = MAKEINTRESOURCEA( def );
|
||||
ici.hwnd = This->hWnd;
|
||||
|
||||
IContextMenu_InvokeCommand(cm, (LPCMINVOKECOMMANDINFO) &ici );
|
||||
IContextMenu_Release(cm);
|
||||
DestroyMenu( hmenu );
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
}
|
||||
DestroyMenu( hmenu );
|
||||
}
|
||||
IContextMenu_Release(cm);
|
||||
}
|
||||
|
||||
|
||||
|
||||
hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl,
|
||||
(LPCITEMIDLIST*)This->apidl, &IID_IDataObject,
|
||||
0, (LPVOID *)&selection);
|
||||
|
||||
|
||||
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
|
||||
|
||||
@@ -1404,10 +1404,10 @@ DoProperties(
|
||||
}
|
||||
else if (_ILIsNetHood(This->dcm.apidl[0]))
|
||||
{
|
||||
/* FIXME
|
||||
* implement nethood properties
|
||||
*/
|
||||
FIXME("implement network connection shell folder\n");
|
||||
//FIXME path!
|
||||
ShellExecuteW(NULL, L"open", L"explorer.exe",
|
||||
L"/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
|
||||
NULL, SW_SHOWDEFAULT);
|
||||
return S_OK;
|
||||
}
|
||||
else if (_ILIsBitBucket(This->dcm.apidl[0]))
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
#ifndef __ACMSC_H__
|
||||
#define __ACMSC_H__
|
||||
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned __int64
|
||||
|
||||
#if defined(_M_IX86)
|
||||
|
||||
#define ACPI_ASM_MACROS
|
||||
#define causeinterrupt(level)
|
||||
#define BREAKPOINT3
|
||||
#define halt() { __asm { sti } __asm { hlt } }
|
||||
#define wbinvd()
|
||||
|
||||
__forceinline void _ACPI_ACQUIRE_GLOBAL_LOCK(void * GLptr, unsigned char * Acq_)
|
||||
{
|
||||
unsigned char Acq;
|
||||
|
||||
__asm
|
||||
{
|
||||
mov ecx, [GLptr]
|
||||
|
||||
L1: mov eax, [ecx]
|
||||
mov edx, eax
|
||||
and edx, ecx
|
||||
bts edx, 1
|
||||
adc edx, 0
|
||||
lock cmpxchg [ecx], edx
|
||||
jne L1
|
||||
cmp dl, 3
|
||||
sbb eax, eax
|
||||
|
||||
mov [Acq], al
|
||||
};
|
||||
|
||||
*Acq_ = Acq;
|
||||
}
|
||||
|
||||
#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \
|
||||
_ACPI_ACQUIRE_GLOBAL_LOCK((GLptr), (unsigned char *)&(Acq))
|
||||
|
||||
__forceinline void _ACPI_RELEASE_GLOBAL_LOCK(void * GLptr, unsigned char * Acq_)
|
||||
{
|
||||
unsigned char Acq;
|
||||
|
||||
__asm
|
||||
{
|
||||
mov ecx, [GLptr]
|
||||
|
||||
L1: mov eax, [ecx]
|
||||
mov edx, eax
|
||||
and edx, ecx
|
||||
lock cmpxchg [ecx], edx
|
||||
jnz L1
|
||||
and eax, 1
|
||||
|
||||
mov [Acq], al
|
||||
};
|
||||
|
||||
*Acq_ = Acq;
|
||||
}
|
||||
|
||||
#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \
|
||||
_ACPI_RELEASE_GLOBAL_LOCK((GLptr), (unsigned char *)&(Acq))
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __ACMSC_H__ */
|
||||
@@ -47,14 +47,25 @@
|
||||
|
||||
#endif
|
||||
|
||||
/* ReactOS uses GCC */
|
||||
#if defined(__GNUC__)
|
||||
|
||||
#include "acgcc.h"
|
||||
|
||||
#undef disable
|
||||
#define disable() __asm__("cli\n\t");
|
||||
#define disable() __asm__("cli\n\t")
|
||||
#undef enable
|
||||
#define enable() __asm__("sti\n\t");
|
||||
#define enable() __asm__("sti\n\t")
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
|
||||
#include "acmsc.h"
|
||||
|
||||
#undef disable
|
||||
#define disable() __asm { cli }
|
||||
#undef enable
|
||||
#define enable() __asm { sti }
|
||||
|
||||
#endif
|
||||
|
||||
#undef DEBUGGER_THREADING
|
||||
#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
@ fastcall KfRaiseIrql(long)
|
||||
@ fastcall KfReleaseSpinLock(ptr long)
|
||||
|
||||
|
||||
@ stdcall HalAcquireDisplayOwnership(ptr)
|
||||
@ stdcall HalAdjustResourceList(ptr)
|
||||
@ stdcall HalAllProcessorsStarted()
|
||||
@@ -9,18 +9,18 @@
|
||||
<define name="_NTHAL_" />
|
||||
<file>hal.c</file>
|
||||
<file>hal.rc</file>
|
||||
<file>hal.spec</file>
|
||||
<file>hal.pspec</file>
|
||||
</module>
|
||||
</if>
|
||||
<if property="ARCH" value="i386">
|
||||
<module name="hal" type="kernelmodedll">
|
||||
<importlibrary definition="hal.spec" />
|
||||
<importlibrary definition="hal.pspec" />
|
||||
<include base="ntoskrnl">include</include>
|
||||
<library>ntoskrnl</library>
|
||||
<define name="_NTHAL_" />
|
||||
<file>hal.c</file>
|
||||
<file>hal.rc</file>
|
||||
<file>hal.spec</file>
|
||||
<file>hal.pspec</file>
|
||||
</module>
|
||||
</if>
|
||||
<if property="ARCH" value="i386">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
|
||||
<module name="halarm_up" type="kernelmodedll" installbase="system32" installname="hal.dll">
|
||||
<importlibrary base="hal" definition="hal.spec" />
|
||||
<importlibrary base="hal" definition="hal.pspec" />
|
||||
<bootstrap installbase="$(CDOUTPUT)" nameoncd="hal.dll" />
|
||||
<include base="halarm_generic">../include</include>
|
||||
<include base="ntoskrnl">include</include>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<module name="halmp" type="kernelmodedll" entrypoint="0">
|
||||
<importlibrary base="hal" definition="hal.spec" />
|
||||
<importlibrary base="hal" definition="hal.pspec" />
|
||||
<bootstrap installbase="$(CDOUTPUT)" />
|
||||
<include>include</include>
|
||||
<include base="ntoskrnl">include</include>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<module name="halup" type="kernelmodedll" entrypoint="0" installname="hal.dll">
|
||||
<importlibrary base="hal" definition="hal.spec" />
|
||||
<importlibrary base="hal" definition="hal.pspec" />
|
||||
<bootstrap installbase="$(CDOUTPUT)" />
|
||||
<include>include</include>
|
||||
<include base="ntoskrnl">include</include>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!DOCTYPE group SYSTEM "../../tools/rbuild/project.dtd">
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<module name="halxbox" type="kernelmodedll" entrypoint="0" allowwarnings="true">
|
||||
<importlibrary base="hal" definition="hal.spec" />
|
||||
<importlibrary base="hal" definition="hal.pspec" />
|
||||
<include>include</include>
|
||||
<include base="ntoskrnl">include</include>
|
||||
<define name="_DISABLE_TIDENTS" />
|
||||
|
||||
@@ -218,11 +218,11 @@ typedef PVOID PUMDHPDEV;
|
||||
typedef D3DNTHAL_CONTEXTCREATEDATA D3DNTHAL_CONTEXTCREATEI;
|
||||
typedef LONG FIX;
|
||||
|
||||
typedef struct _CHWIDTHINFO
|
||||
typedef struct _CHWIDTHINFO // Based on FD_DEVICEMETRICS
|
||||
{
|
||||
LONG lMaxNegA;
|
||||
LONG lMaxNegC;
|
||||
LONG lMinWidthD;
|
||||
LONG lMinA;
|
||||
LONG lMinC;
|
||||
LONG lMinD;
|
||||
} CHWIDTHINFO, *PCHWIDTHINFO;
|
||||
|
||||
typedef struct _UNIVERSAL_FONT_ID
|
||||
|
||||
+12
-5
@@ -79,7 +79,7 @@ vDbgPrintExWithPrefixInternal(IN LPCSTR Prefix,
|
||||
|
||||
/* Copy it */
|
||||
strncpy(Buffer, Prefix, PrefixLength);
|
||||
|
||||
|
||||
/* Do the printf */
|
||||
Length = _vsnprintf(Buffer + PrefixLength,
|
||||
sizeof(Buffer) - PrefixLength,
|
||||
@@ -109,7 +109,7 @@ vDbgPrintExWithPrefixInternal(IN LPCSTR Prefix,
|
||||
/* Add the prefix */
|
||||
Length += PrefixLength;
|
||||
}
|
||||
|
||||
|
||||
/* Build the string */
|
||||
DebugString.Length = Length;
|
||||
DebugString.Buffer = Buffer;
|
||||
@@ -202,17 +202,19 @@ __cdecl
|
||||
DbgPrint(PCCH Format,
|
||||
...)
|
||||
{
|
||||
ULONG n;
|
||||
va_list ap;
|
||||
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
va_start(ap, Format);
|
||||
return vDbgPrintExWithPrefixInternal("",
|
||||
n = vDbgPrintExWithPrefixInternal("",
|
||||
-1,
|
||||
DPFLTR_ERROR_LEVEL,
|
||||
Format,
|
||||
ap,
|
||||
TRUE);
|
||||
va_end(ap);
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -225,17 +227,19 @@ DbgPrintEx(IN ULONG ComponentId,
|
||||
IN PCCH Format,
|
||||
...)
|
||||
{
|
||||
ULONG n;
|
||||
va_list ap;
|
||||
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
va_start(ap, Format);
|
||||
return vDbgPrintExWithPrefixInternal("",
|
||||
n = vDbgPrintExWithPrefixInternal("",
|
||||
ComponentId,
|
||||
Level,
|
||||
Format,
|
||||
ap,
|
||||
TRUE);
|
||||
va_end(ap);
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -246,16 +250,19 @@ __cdecl
|
||||
DbgPrintReturnControlC(PCH Format,
|
||||
...)
|
||||
{
|
||||
ULONG n;
|
||||
va_list ap;
|
||||
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
va_start(ap, Format);
|
||||
return vDbgPrintExWithPrefixInternal("",
|
||||
n = vDbgPrintExWithPrefixInternal("",
|
||||
-1,
|
||||
DPFLTR_ERROR_LEVEL,
|
||||
Format,
|
||||
ap,
|
||||
FALSE);
|
||||
va_end(ap);
|
||||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -60,7 +60,7 @@ static int is_data_file_module( PVOID BaseAddress )
|
||||
*/
|
||||
int push_language( USHORT *list, ULONG pos, WORD lang )
|
||||
{
|
||||
int i;
|
||||
ULONG i;
|
||||
for (i = 0; i < pos; i++) if (list[i] == lang) return pos;
|
||||
list[pos++] = lang;
|
||||
return pos;
|
||||
|
||||
@@ -31,9 +31,7 @@
|
||||
#include <reactos/helper.h>
|
||||
#include <pseh/pseh.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#include <intrin.h>
|
||||
#endif
|
||||
|
||||
#endif /* RTL_H */
|
||||
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
#include <precomp.h>
|
||||
#include <math.h>
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define FPU_DOUBLE(var) double var; \
|
||||
__asm__ __volatile__( "fstpl %0;fwait" : "=m" (var) : )
|
||||
#define FPU_DOUBLES(var1,var2) double var1,var2; \
|
||||
__asm__ __volatile__( "fstpl %0;fwait" : "=m" (var2) : ); \
|
||||
__asm__ __volatile__( "fstpl %0;fwait" : "=m" (var1) : )
|
||||
#elif defined(_MSC_VER)
|
||||
#define FPU_DOUBLE(var) double var; \
|
||||
__asm { fstp [var] }; __asm { fwait };
|
||||
#define FPU_DOUBLES(var1,var2) double var1,var2; \
|
||||
__asm { fstp [var1] }; __asm { fwait }; \
|
||||
__asm { fstp [var2] }; __asm { fwait };
|
||||
#endif
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
||||
@@ -594,7 +594,7 @@ int toupper(int c)
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
wchar_t towlower(wchar_t c)
|
||||
wint_t towlower(wint_t c)
|
||||
{
|
||||
if (iswctype (c, _UPPER))
|
||||
return (c - upalpha);
|
||||
@@ -604,7 +604,7 @@ wchar_t towlower(wchar_t c)
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
wchar_t towupper(wchar_t c)
|
||||
wint_t towupper(wint_t c)
|
||||
{
|
||||
if (iswctype (c, _LOWER))
|
||||
return (c + upalpha);
|
||||
|
||||
@@ -88,6 +88,48 @@ Ke386SanitizeDr(IN PVOID DrAddress,
|
||||
}
|
||||
#endif /* _M_IX86 */
|
||||
|
||||
#ifndef _M_ARM
|
||||
PRKTHREAD
|
||||
FORCEINLINE
|
||||
KeGetCurrentThread(VOID)
|
||||
{
|
||||
#ifdef _M_IX86
|
||||
/* Return the current thread */
|
||||
return ((PKIPCR)KeGetPcr())->PrcbData.CurrentThread;
|
||||
#elif defined (_M_AMD64)
|
||||
return (PRKTHREAD)__readgsqword(FIELD_OFFSET(KIPCR, Prcb.CurrentThread));
|
||||
#else
|
||||
PKPRCB Prcb = KeGetCurrentPrcb();
|
||||
return Prcb->CurrentThread;
|
||||
#endif
|
||||
}
|
||||
|
||||
UCHAR
|
||||
FORCEINLINE
|
||||
KeGetPreviousMode(VOID)
|
||||
{
|
||||
/* Return the current mode */
|
||||
return KeGetCurrentThread()->PreviousMode;
|
||||
}
|
||||
#endif
|
||||
|
||||
VOID
|
||||
FORCEINLINE
|
||||
KeFlushProcessTb(VOID)
|
||||
{
|
||||
/* Flush the TLB by resetting CR3 */
|
||||
#ifdef _M_PPC
|
||||
__asm__("sync\n\tisync\n\t");
|
||||
#elif _M_ARM
|
||||
//
|
||||
// We need to implement this!
|
||||
//
|
||||
ASSERTMSG("Need ARM flush routine\n", FALSE);
|
||||
#else
|
||||
__writecr3(__readcr3());
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// Enters a Guarded Region
|
||||
//
|
||||
@@ -411,7 +453,10 @@ KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
#ifdef DBG
|
||||
/* On debug builds, we use a much slower but useful routine */
|
||||
Kii386SpinOnSpinLock(SpinLock, 5);
|
||||
//Kii386SpinOnSpinLock(SpinLock, 5);
|
||||
|
||||
/* FIXME: Do normal yield for now */
|
||||
YieldProcessor();
|
||||
#else
|
||||
/* Otherwise, just yield and keep looping */
|
||||
YieldProcessor();
|
||||
@@ -422,7 +467,7 @@ KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
#ifdef DBG
|
||||
/* On debug builds, we OR in the KTHREAD */
|
||||
*SpinLock = KeGetCurrentThread() | 1;
|
||||
*SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1;
|
||||
#endif
|
||||
/* All is well, break out */
|
||||
break;
|
||||
@@ -439,21 +484,21 @@ KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
#ifdef DBG
|
||||
/* Make sure that the threads match */
|
||||
if ((KeGetCurrentThread() | 1) != *SpinLock)
|
||||
if (((KSPIN_LOCK)KeGetCurrentThread() | 1) != *SpinLock)
|
||||
{
|
||||
/* They don't, bugcheck */
|
||||
KeBugCheckEx(SPIN_LOCK_NOT_OWNED, SpinLock, 0, 0, 0);
|
||||
KeBugCheckEx(SPIN_LOCK_NOT_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0);
|
||||
}
|
||||
#endif
|
||||
/* Clear the lock */
|
||||
InterlockedAnd(SpinLock, 0);
|
||||
InterlockedAnd((PLONG)SpinLock, 0);
|
||||
}
|
||||
|
||||
KIRQL
|
||||
VOID
|
||||
FORCEINLINE
|
||||
KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object)
|
||||
{
|
||||
LONG OldValue, NewValue;
|
||||
LONG OldValue;
|
||||
|
||||
/* Make sure we're at a safe level to touch the lock */
|
||||
ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
|
||||
@@ -462,20 +507,23 @@ KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object)
|
||||
do
|
||||
{
|
||||
/* Loop until the other CPU releases it */
|
||||
while ((UCHAR)Object->Lock & KOBJECT_LOCK_BIT)
|
||||
while (TRUE)
|
||||
{
|
||||
/* Check if it got released */
|
||||
OldValue = Object->Lock;
|
||||
if ((OldValue & KOBJECT_LOCK_BIT) == 0) break;
|
||||
|
||||
/* Let the CPU know that this is a loop */
|
||||
YieldProcessor();
|
||||
};
|
||||
}
|
||||
|
||||
/* Try acquiring the lock now */
|
||||
NewValue = InterlockedCompareExchange(&Object->Lock,
|
||||
OldValue | KOBJECT_LOCK_BIT,
|
||||
OldValue);
|
||||
} while (NewValue != OldValue);
|
||||
} while (InterlockedCompareExchange(&Object->Lock,
|
||||
OldValue | KOBJECT_LOCK_BIT,
|
||||
OldValue) != OldValue);
|
||||
}
|
||||
|
||||
KIRQL
|
||||
VOID
|
||||
FORCEINLINE
|
||||
KiReleaseDispatcherObject(IN DISPATCHER_HEADER* Object)
|
||||
{
|
||||
@@ -506,6 +554,22 @@ KiReleaseDispatcherLock(IN KIRQL OldIrql)
|
||||
KiExitDispatcher(OldIrql);
|
||||
}
|
||||
|
||||
VOID
|
||||
FORCEINLINE
|
||||
KiAcquireDispatcherLockAtDpcLevel(VOID)
|
||||
{
|
||||
/* Acquire the dispatcher lock */
|
||||
KeAcquireQueuedSpinLockAtDpcLevel(LockQueueDispatcherLock);
|
||||
}
|
||||
|
||||
VOID
|
||||
FORCEINLINE
|
||||
KiReleaseDispatcherLockFromDpcLevel(VOID)
|
||||
{
|
||||
/* Release the dispatcher lock */
|
||||
KeReleaseQueuedSpinLockFromDpcLevel(LockQueueDispatcherLock);
|
||||
}
|
||||
|
||||
//
|
||||
// This routine inserts a thread into the deferred ready list of the given CPU
|
||||
//
|
||||
@@ -569,7 +633,7 @@ KiAcquirePrcbLock(IN PKPRCB Prcb)
|
||||
for (;;)
|
||||
{
|
||||
/* Acquire the lock and break out if we acquired it first */
|
||||
if (!InterlockedExchange(&Prcb->PrcbLock, 1)) break;
|
||||
if (!InterlockedExchange((PLONG)&Prcb->PrcbLock, 1)) break;
|
||||
|
||||
/* Loop until the other CPU releases it */
|
||||
do
|
||||
@@ -595,7 +659,7 @@ KiReleasePrcbLock(IN PKPRCB Prcb)
|
||||
ASSERT(Prcb->PrcbLock != 0);
|
||||
|
||||
/* Release it */
|
||||
InterlockedAnd(&Prcb->PrcbLock, 0);
|
||||
InterlockedAnd((PLONG)&Prcb->PrcbLock, 0);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -616,7 +680,7 @@ KiAcquireThreadLock(IN PKTHREAD Thread)
|
||||
for (;;)
|
||||
{
|
||||
/* Acquire the lock and break out if we acquired it first */
|
||||
if (!InterlockedExchange(&Thread->ThreadLock, 1)) break;
|
||||
if (!InterlockedExchange((PLONG)&Thread->ThreadLock, 1)) break;
|
||||
|
||||
/* Loop until the other CPU releases it */
|
||||
do
|
||||
@@ -639,7 +703,7 @@ VOID
|
||||
KiReleaseThreadLock(IN PKTHREAD Thread)
|
||||
{
|
||||
/* Release it */
|
||||
InterlockedAnd(&Thread->ThreadLock, 0);
|
||||
InterlockedAnd((PLONG)&Thread->ThreadLock, 0);
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
@@ -653,7 +717,7 @@ KiTryThreadLock(IN PKTHREAD Thread)
|
||||
|
||||
/* Otherwise, try to acquire it and check the result */
|
||||
Value = 1;
|
||||
Value = InterlockedExchange(&Thread->ThreadLock, &Value);
|
||||
Value = InterlockedExchange((PLONG)&Thread->ThreadLock, Value);
|
||||
|
||||
/* Return the lock state */
|
||||
return (Value == TRUE);
|
||||
@@ -667,6 +731,16 @@ KiCheckDeferredReadyList(IN PKPRCB Prcb)
|
||||
if (Prcb->DeferredReadyListHead.Next) KiProcessDeferredReadyList(Prcb);
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
VOID
|
||||
KiRundownThread(IN PKTHREAD Thread)
|
||||
{
|
||||
#if defined(_M_IX86) || defined(_M_AMD64)
|
||||
/* FIXME: TODO */
|
||||
ASSERTMSG("Not yet implemented\n", FALSE);
|
||||
#endif
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
VOID
|
||||
KiRequestApcInterrupt(IN BOOLEAN NeedApc,
|
||||
@@ -676,10 +750,10 @@ KiRequestApcInterrupt(IN BOOLEAN NeedApc,
|
||||
if (NeedApc)
|
||||
{
|
||||
/* Check if it's on another CPU */
|
||||
if (KeGetPcr()->Number != Cpu)
|
||||
if (KeGetPcr()->Number != Processor)
|
||||
{
|
||||
/* Send an IPI to request delivery */
|
||||
KiIpiSendRequest(AFFINITY_MASK(Cpu), IPI_DPC);
|
||||
KiIpiSendRequest(AFFINITY_MASK(Processor), IPI_APC);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -689,6 +763,36 @@ KiRequestApcInterrupt(IN BOOLEAN NeedApc,
|
||||
}
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
PKSPIN_LOCK_QUEUE
|
||||
KiAcquireTimerLock(IN ULONG Hand)
|
||||
{
|
||||
PKSPIN_LOCK_QUEUE LockQueue;
|
||||
ULONG LockIndex;
|
||||
ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
|
||||
|
||||
/* Get the lock index */
|
||||
LockIndex = Hand >> LOCK_QUEUE_TIMER_LOCK_SHIFT;
|
||||
LockIndex &= (LOCK_QUEUE_TIMER_TABLE_LOCKS - 1);
|
||||
|
||||
/* Now get the lock */
|
||||
LockQueue = &KeGetCurrentPrcb()->LockQueue[LockQueueTimerTableLock + LockIndex];
|
||||
|
||||
/* Acquire it and return */
|
||||
KeAcquireQueuedSpinLockAtDpcLevel(LockQueue);
|
||||
return LockQueue;
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
VOID
|
||||
KiReleaseTimerLock(IN PKSPIN_LOCK_QUEUE LockQueue)
|
||||
{
|
||||
ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL);
|
||||
|
||||
/* Release the lock */
|
||||
KeReleaseQueuedSpinLockFromDpcLevel(LockQueue);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
FORCEINLINE
|
||||
@@ -1525,46 +1629,3 @@ KiComputeNewPriority(IN PKTHREAD Thread,
|
||||
/* Return the new priority */
|
||||
return Priority;
|
||||
}
|
||||
|
||||
#ifndef _M_ARM
|
||||
PRKTHREAD
|
||||
FORCEINLINE
|
||||
KeGetCurrentThread(VOID)
|
||||
{
|
||||
#ifdef _M_IX86
|
||||
/* Return the current thread */
|
||||
return ((PKIPCR)KeGetPcr())->PrcbData.CurrentThread;
|
||||
#elif defined (_M_AMD64)
|
||||
return (PRKTHREAD)__readgsqword(FIELD_OFFSET(KIPCR, Prcb.CurrentThread));
|
||||
#else
|
||||
PKPRCB Prcb = KeGetCurrentPrcb();
|
||||
return Prcb->CurrentThread;
|
||||
#endif
|
||||
}
|
||||
|
||||
UCHAR
|
||||
FORCEINLINE
|
||||
KeGetPreviousMode(VOID)
|
||||
{
|
||||
/* Return the current mode */
|
||||
return KeGetCurrentThread()->PreviousMode;
|
||||
}
|
||||
#endif
|
||||
|
||||
VOID
|
||||
FORCEINLINE
|
||||
KeFlushProcessTb(VOID)
|
||||
{
|
||||
/* Flush the TLB by resetting CR3 */
|
||||
#ifdef _M_PPC
|
||||
__asm__("sync\n\tisync\n\t");
|
||||
#elif _M_ARM
|
||||
//
|
||||
// We need to implement this!
|
||||
//
|
||||
ASSERTMSG("Need ARM flush routine\n", FALSE);
|
||||
#else
|
||||
__writecr3(__readcr3());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -398,6 +398,10 @@ KeSetTimerEx(IN OUT PKTIMER Timer,
|
||||
|
||||
/* Check if we need to do an interrupt */
|
||||
if (RequestInterrupt) HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
|
||||
|
||||
/* Exit the dispatcher and return the old state */
|
||||
KiExitDispatcher(OldIrql);
|
||||
return Inserted;
|
||||
}
|
||||
|
||||
/* Set the time as Absolute */
|
||||
@@ -419,7 +423,7 @@ KeSetTimerEx(IN OUT PKTIMER Timer,
|
||||
Timer->Header.SignalState = FALSE;
|
||||
KxInsertTimer(Timer, Hand);
|
||||
|
||||
/* Release Dispatcher Lock */
|
||||
/* Exit the dispatcher */
|
||||
KiExitDispatcher(OldIrql);
|
||||
|
||||
/* Return old state */
|
||||
|
||||
@@ -4644,18 +4644,21 @@ MmMapViewOfSection(IN PVOID SectionObject,
|
||||
if ((Protect & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE)) &&
|
||||
!(Section->SectionPageProtection & (PAGE_READWRITE|PAGE_EXECUTE_READWRITE)))
|
||||
{
|
||||
MmUnlockAddressSpace(AddressSpace);
|
||||
return STATUS_SECTION_PROTECTION;
|
||||
}
|
||||
/* check for read access */
|
||||
if ((Protect & (PAGE_READONLY|PAGE_WRITECOPY|PAGE_EXECUTE_READ|PAGE_EXECUTE_WRITECOPY)) &&
|
||||
!(Section->SectionPageProtection & (PAGE_READONLY|PAGE_READWRITE|PAGE_WRITECOPY|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY)))
|
||||
{
|
||||
MmUnlockAddressSpace(AddressSpace);
|
||||
return STATUS_SECTION_PROTECTION;
|
||||
}
|
||||
/* check for execute access */
|
||||
if ((Protect & (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY)) &&
|
||||
!(Section->SectionPageProtection & (PAGE_EXECUTE|PAGE_EXECUTE_READ|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY)))
|
||||
{
|
||||
MmUnlockAddressSpace(AddressSpace);
|
||||
return STATUS_SECTION_PROTECTION;
|
||||
}
|
||||
|
||||
|
||||
@@ -947,6 +947,9 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
SIZE_T ResultLength = 0;
|
||||
KPROCESSOR_MODE PreviousMode;
|
||||
WCHAR ModuleFileNameBuffer[MAX_PATH] = {0};
|
||||
UNICODE_STRING ModuleFileName;
|
||||
PMEMORY_SECTION_NAME SectionName = NULL;
|
||||
union
|
||||
{
|
||||
MEMORY_BASIC_INFORMATION BasicInfo;
|
||||
@@ -985,13 +988,58 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = MiQueryVirtualMemory(ProcessHandle,
|
||||
Address,
|
||||
VirtualMemoryInformationClass,
|
||||
&VirtualMemoryInfo,
|
||||
Length,
|
||||
&ResultLength );
|
||||
|
||||
/* FIXME: Move this inside MiQueryVirtualMemory */
|
||||
if (VirtualMemoryInformationClass == MemorySectionName)
|
||||
{
|
||||
RtlInitEmptyUnicodeString(&ModuleFileName, ModuleFileNameBuffer, sizeof(ModuleFileNameBuffer));
|
||||
Status = MmGetFileNameForAddress(Address, &ModuleFileName);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
SectionName = VirtualMemoryInformation;
|
||||
if (PreviousMode != KernelMode)
|
||||
{
|
||||
_SEH_TRY
|
||||
{
|
||||
RtlInitUnicodeString(&SectionName->SectionFileName, SectionName->NameBuffer);
|
||||
SectionName->SectionFileName.MaximumLength = Length;
|
||||
RtlCopyUnicodeString(&SectionName->SectionFileName, &ModuleFileName);
|
||||
|
||||
if (UnsafeResultLength != NULL)
|
||||
{
|
||||
*UnsafeResultLength = ModuleFileName.Length;
|
||||
}
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
}
|
||||
else
|
||||
{
|
||||
RtlInitUnicodeString(&SectionName->SectionFileName, SectionName->NameBuffer);
|
||||
SectionName->SectionFileName.MaximumLength = Length;
|
||||
RtlCopyUnicodeString(&SectionName->SectionFileName, &ModuleFileName);
|
||||
|
||||
if (UnsafeResultLength != NULL)
|
||||
{
|
||||
*UnsafeResultLength = ModuleFileName.Length;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Status;
|
||||
}
|
||||
else
|
||||
{
|
||||
Status = MiQueryVirtualMemory(ProcessHandle,
|
||||
Address,
|
||||
VirtualMemoryInformationClass,
|
||||
&VirtualMemoryInfo,
|
||||
Length,
|
||||
&ResultLength);
|
||||
}
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
if (PreviousMode != KernelMode)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!DOCTYPE module SYSTEM "../tools/rbuild/project.dtd">
|
||||
<module name="ntoskrnl" type="kernel" installbase="system32" installname="ntoskrnl.exe" baseaddress="0xfffff80000800000" entrypoint="KiSystemStartup" allowwarnings="true">
|
||||
<bootstrap installbase="$(CDOUTPUT)" />
|
||||
<importlibrary definition="ntoskrnl.spec" />
|
||||
<importlibrary definition="ntoskrnl.pspec" />
|
||||
<define name="_DISABLE_TIDENTS" />
|
||||
<define name="__NTOSKRNL__" />
|
||||
<define name="_NTOSKRNL_" />
|
||||
@@ -483,7 +483,7 @@
|
||||
<file>wmi.c</file>
|
||||
</directory>
|
||||
<file>ntoskrnl.rc</file>
|
||||
<file>ntoskrnl.spec</file>
|
||||
<file>ntoskrnl.pspec</file>
|
||||
<linkerscript>ntoskrnl_$(ARCH).lnk</linkerscript>
|
||||
</module>
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<!DOCTYPE module SYSTEM "../tools/rbuild/project.dtd">
|
||||
<group xmlns:xi="http://www.w3.org/2001/XInclude">
|
||||
<bootstrap installbase="$(CDOUTPUT)" />
|
||||
<importlibrary definition="ntoskrnl.spec" />
|
||||
<importlibrary definition="ntoskrnl.pspec" />
|
||||
<define name="_DISABLE_TIDENTS" />
|
||||
<define name="__NTOSKRNL__" />
|
||||
<define name="_NTOSKRNL_" />
|
||||
@@ -466,6 +466,6 @@
|
||||
<file>wmi.c</file>
|
||||
</directory>
|
||||
<file>ntoskrnl.rc</file>
|
||||
<file>ntoskrnl.spec</file>
|
||||
<file>ntoskrnl.pspec</file>
|
||||
<linkerscript>ntoskrnl_$(ARCH).lnk</linkerscript>
|
||||
</group>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2167,6 +2167,7 @@ NtGdiSelectBrush(
|
||||
if (pBrush == NULL)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
DC_UnlockDc(pDC);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2174,6 +2175,7 @@ NtGdiSelectBrush(
|
||||
BRUSHOBJ_UnlockBrush(pBrush);
|
||||
if(bFailed)
|
||||
{
|
||||
DC_UnlockDc(pDC);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,2 +1,151 @@
|
||||
/* EMPTY FOR NOW */
|
||||
/* Hope I didn't delete existing defs!! Check CVS version of this file.. */
|
||||
/*
|
||||
* PROJECT: ReactOS win32 kernel mode subsystem
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: subsystems/win32/win32k/objects/font.c
|
||||
* PURPOSE: Font
|
||||
* PROGRAMMER:
|
||||
*/
|
||||
|
||||
/** Includes ******************************************************************/
|
||||
|
||||
#include <w32k.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
//
|
||||
// FIXME PLEASE!!!!
|
||||
// Why are these here? Well there is a problem with drivers/directx.
|
||||
// 1st: It does not belong there.
|
||||
// 2nd: Due to being placed outside Win32k build environment, it creates
|
||||
// compiling issues.
|
||||
// Until svn mv drivers/directx subsystem/win32/win32k/drivers/directx,
|
||||
// it will not get fixed.
|
||||
//
|
||||
ULONG
|
||||
FASTCALL
|
||||
ftGdiGetGlyphOutline(
|
||||
IN PDC pdc,
|
||||
IN WCHAR wch,
|
||||
IN UINT iFormat,
|
||||
OUT LPGLYPHMETRICS pgm,
|
||||
IN ULONG cjBuf,
|
||||
OUT OPTIONAL PVOID UnsafeBuf,
|
||||
IN LPMAT2 pmat2,
|
||||
IN BOOL bIgnoreRotation);
|
||||
|
||||
INT
|
||||
FASTCALL
|
||||
IntGetOutlineTextMetrics(PFONTGDI FontGDI, UINT Size, OUTLINETEXTMETRICW *Otm);
|
||||
|
||||
/** Functions ******************************************************************/
|
||||
|
||||
ULONG
|
||||
APIENTRY
|
||||
NtGdiGetGlyphOutline(
|
||||
IN HDC hdc,
|
||||
IN WCHAR wch,
|
||||
IN UINT iFormat,
|
||||
OUT LPGLYPHMETRICS pgm,
|
||||
IN ULONG cjBuf,
|
||||
OUT OPTIONAL PVOID UnsafeBuf,
|
||||
IN LPMAT2 pmat2,
|
||||
IN BOOL bIgnoreRotation)
|
||||
{
|
||||
ULONG Ret;
|
||||
PDC dc;
|
||||
dc = DC_LockDc(hdc);
|
||||
if (!dc)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return GDI_ERROR;
|
||||
}
|
||||
Ret = ftGdiGetGlyphOutline( dc,
|
||||
wch,
|
||||
iFormat,
|
||||
pgm,
|
||||
cjBuf,
|
||||
UnsafeBuf,
|
||||
pmat2,
|
||||
bIgnoreRotation);
|
||||
DC_UnlockDc(dc);
|
||||
return Ret;
|
||||
}
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
NtGdiGetKerningPairs(HDC hDC,
|
||||
ULONG NumPairs,
|
||||
LPKERNINGPAIR krnpair)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
From "Undocumented Windows 2000 Secrets" Appendix B, Table B-2, page
|
||||
472, this is NtGdiGetOutlineTextMetricsInternalW.
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
NtGdiGetOutlineTextMetricsInternalW (HDC hDC,
|
||||
ULONG Data,
|
||||
OUTLINETEXTMETRICW *otm,
|
||||
TMDIFF *Tmd)
|
||||
{
|
||||
PDC dc;
|
||||
PDC_ATTR Dc_Attr;
|
||||
PTEXTOBJ TextObj;
|
||||
PFONTGDI FontGDI;
|
||||
HFONT hFont = 0;
|
||||
ULONG Size;
|
||||
OUTLINETEXTMETRICW *potm;
|
||||
NTSTATUS Status;
|
||||
|
||||
dc = DC_LockDc(hDC);
|
||||
if (dc == NULL)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return 0;
|
||||
}
|
||||
Dc_Attr = dc->pDc_Attr;
|
||||
if(!Dc_Attr) Dc_Attr = &dc->Dc_Attr;
|
||||
hFont = Dc_Attr->hlfntNew;
|
||||
TextObj = TEXTOBJ_LockText(hFont);
|
||||
DC_UnlockDc(dc);
|
||||
if (TextObj == NULL)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return 0;
|
||||
}
|
||||
FontGDI = ObjToGDI(TextObj->Font, FONT);
|
||||
TEXTOBJ_UnlockText(TextObj);
|
||||
Size = IntGetOutlineTextMetrics(FontGDI, 0, NULL);
|
||||
if (!otm) return Size;
|
||||
if (Size > Data)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INSUFFICIENT_BUFFER);
|
||||
return 0;
|
||||
}
|
||||
potm = ExAllocatePoolWithTag(PagedPool, Size, TAG_GDITEXT);
|
||||
if (NULL == potm)
|
||||
{
|
||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return 0;
|
||||
}
|
||||
IntGetOutlineTextMetrics(FontGDI, Size, potm);
|
||||
if (otm)
|
||||
{
|
||||
Status = MmCopyToCaller(otm, potm, Size);
|
||||
if (! NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||
ExFreePool(potm);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
ExFreePool(potm);
|
||||
return Size;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -161,6 +161,8 @@
|
||||
<file>dibobj.c</file>
|
||||
<file>drawing.c</file>
|
||||
<file>fillshap.c</file>
|
||||
<file>font.c</file>
|
||||
<file>freetype.c</file>
|
||||
<file>gdibatch.c</file>
|
||||
<file>gdiobj.c</file>
|
||||
<file>icm.c</file>
|
||||
@@ -183,7 +185,7 @@
|
||||
</directory>
|
||||
</module>
|
||||
<module name="win32k" type="kernelmodedriver" installbase="system32" installname="win32k.sys" allowwarnings="true">
|
||||
<importlibrary definition="win32k.spec" />
|
||||
<importlibrary definition="win32k.pspec" />
|
||||
<library>win32k_base</library>
|
||||
<library>pseh</library>
|
||||
<library>ntoskrnl</library>
|
||||
|
||||
@@ -685,7 +685,7 @@ CBBackend::_generate_cbproj ( const Module& module )
|
||||
#if 0
|
||||
if ( dll )
|
||||
{
|
||||
if (IsWineModule( module ))
|
||||
if (IsSpecDefinitionFile( module ))
|
||||
fprintf ( OUT, "\t\t\t\t\t<Add before=\"%s\\tools\\winebuild\\winebuild.exe -o %s --def -E %s.spec\" />\r\n", outdir.c_str(), module.importLibrary->definition.c_str(), module.name.c_str());
|
||||
fprintf ( OUT, "\t\t\t\t\t<Add before=\"dlltool --dllname %s --def %s --output-exp %s.temp.exp %s\" />\r\n", module.GetTargetName ().c_str(), module.importLibrary->definition.c_str(), module.name.c_str(), module.mangledSymbols ? "" : "--kill-at" );
|
||||
fprintf ( OUT, "\t\t\t\t\t<Add after=\"%s\\tools\\pefixup $exe_output -exports\" />\r\n", outdir.c_str() );
|
||||
@@ -902,11 +902,11 @@ CBBackend::_lookup_property ( const Module& module, const std::string& name ) co
|
||||
}
|
||||
|
||||
bool
|
||||
CBBackend::IsWineModule ( const Module& module ) const
|
||||
CBBackend::IsSpecDefinitionFile ( const Module& module ) const
|
||||
{
|
||||
if ( module.importLibrary == NULL)
|
||||
return false;
|
||||
|
||||
size_t index = module.importLibrary->source->name.rfind ( ".spec.def" );
|
||||
size_t index = module.importLibrary->source->name.rfind ( ".spec" );
|
||||
return ( index != string::npos );
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ class CBBackend : public Backend
|
||||
std::string DependFileName ( const Module& module ) const;
|
||||
std::string GenerateProjectLinkerFlags () const;
|
||||
void MingwAddImplicitLibraries( Module &module );
|
||||
bool IsWineModule ( const Module& module ) const;
|
||||
bool IsSpecDefinitionFile ( const Module& module ) const;
|
||||
std::vector<CBConfiguration*> m_configurations;
|
||||
|
||||
std::vector<FileUnit> m_fileUnits;
|
||||
|
||||
@@ -416,13 +416,13 @@ MingwModuleHandler::GetObjectFilename (
|
||||
|
||||
if ( module.type == BootSector )
|
||||
return new FileLocation ( *module.output );
|
||||
else if ( extension == ".rc" || extension == ".RC" )
|
||||
else if (extension == ".rc")
|
||||
newExtension = "_" + module.name + ".coff";
|
||||
else if ( extension == ".mc" || extension == ".MC" )
|
||||
else if (extension == ".mc")
|
||||
newExtension = ".rc";
|
||||
else if ( extension == ".spec" || extension == ".SPEC" )
|
||||
else if (extension == ".spec" || extension == ".pspec")
|
||||
newExtension = "_" + module.name + ".stubs.o";
|
||||
else if ( extension == ".idl" || extension == ".IDL" )
|
||||
else if (extension == ".idl")
|
||||
{
|
||||
if ( module.type == RpcServer )
|
||||
newExtension = "_s.o";
|
||||
@@ -1056,28 +1056,28 @@ Rule wmcRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc",
|
||||
"$(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildKMDefRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).spec.def: $(source)$(dependencies) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
|
||||
"\t$(ECHO_WINEBLD)\n"
|
||||
"\t${gcc} -xc -E $(source) -I. > $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec\n"
|
||||
"\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext)_$(module_name).spec.def --def -E $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec\n\n",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).spec.def",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildKMRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.c:\n"
|
||||
"\t${cp} $(NUL) $@ 1>$(NUL)\n"
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.c$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
|
||||
"\t$(ECHO_CC)\n"
|
||||
"\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.c",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.o",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildDefRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).spec.def: $(source)$(dependencies) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
|
||||
"\t$(ECHO_WINEBLD)\n"
|
||||
"\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext)_$(module_name).spec.def --def -E $(source)\n\n",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).spec.def",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildPDefRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).auto.def: $(source)$(dependencies) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
|
||||
"\t$(ECHO_WINEBLD)\n"
|
||||
"\t${gcc} -xc -E $(source) -I. > $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec\n"
|
||||
"\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext)_$(module_name).auto.def --def -E $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec\n\n",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).auto.def",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildPRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.c:\n"
|
||||
"\t${cp} $(NUL) $@ 1>$(NUL)\n"
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.c$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
|
||||
"\t$(ECHO_CC)\n"
|
||||
"\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.c",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).stubs.o",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildDefRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).auto.def: $(source)$(dependencies) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
|
||||
"\t$(ECHO_WINEBLD)\n"
|
||||
"\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext)_$(module_name).auto.def --def -E $(source)\n\n",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).auto.def",
|
||||
"$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
|
||||
Rule winebuildRule ( "$(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext)_$(module_name).stubs.c: $(source_path)$(SEP)$(source_name_noext).spec $(WINEBUILD_TARGET)\n"
|
||||
"\t$(ECHO_WINEBLD)\n"
|
||||
"\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext)_$(module_name).stubs.c --pedll $(source_path)$(SEP)$(source_name_noext).spec\n"
|
||||
@@ -1256,8 +1256,7 @@ MingwModuleHandler::GenerateCommands (
|
||||
{ HostDontCare, TypeDontCare, ".asm", &nasmRule },
|
||||
{ HostDontCare, TypeDontCare, ".rc", &windresRule },
|
||||
{ HostDontCare, TypeDontCare, ".mc", &wmcRule },
|
||||
{ HostFalse, Kernel, ".spec", &winebuildKMRule },
|
||||
{ HostFalse, KernelModeDLL, ".spec", &winebuildKMRule },
|
||||
{ HostDontCare, TypeDontCare, ".pspec", &winebuildPRule },
|
||||
{ HostDontCare, TypeDontCare, ".spec", &winebuildRule },
|
||||
{ HostDontCare, RpcServer, ".idl", &widlServerRule },
|
||||
{ HostDontCare, RpcClient, ".idl", &widlClientRule },
|
||||
@@ -1856,7 +1855,7 @@ MingwModuleHandler::GenerateOtherMacros ()
|
||||
used_defs );
|
||||
}
|
||||
|
||||
if ( IsWineModule() )
|
||||
if ( IsSpecDefinitionFile() )
|
||||
{
|
||||
vector<FileLocation> s;
|
||||
GetSpecImplibDependencies ( s, module.importLibrary->source );
|
||||
@@ -1988,6 +1987,8 @@ MingwModuleHandler::GenerateOtherMacros ()
|
||||
void
|
||||
MingwModuleHandler::GenerateRules ()
|
||||
{
|
||||
SpecFileType spec;
|
||||
|
||||
fprintf ( fMakefile, "# RULES\n" );
|
||||
string targetMacro = GetTargetMacro ( module );
|
||||
//CLEAN_FILE ( targetMacro );
|
||||
@@ -2015,12 +2016,15 @@ MingwModuleHandler::GenerateRules ()
|
||||
delete ar_target;
|
||||
}
|
||||
|
||||
if ( IsWineModule() )
|
||||
|
||||
spec = IsSpecDefinitionFile();
|
||||
|
||||
if(spec)
|
||||
{
|
||||
Rule * defRule;
|
||||
|
||||
if ( module.type == Kernel || module.type == KernelModeDLL || module.type == KernelModeDriver )
|
||||
defRule = &winebuildKMDefRule;
|
||||
if (spec == PSpec)
|
||||
defRule = &winebuildPDefRule;
|
||||
else
|
||||
defRule = &winebuildDefRule;
|
||||
|
||||
@@ -2172,14 +2176,19 @@ MingwModuleHandler::GeneratePreconditionDependencies ()
|
||||
fprintf ( fMakefile, "\n" );
|
||||
}
|
||||
|
||||
bool
|
||||
MingwModuleHandler::IsWineModule () const
|
||||
SpecFileType
|
||||
MingwModuleHandler::IsSpecDefinitionFile () const
|
||||
{
|
||||
if ( module.importLibrary == NULL)
|
||||
return false;
|
||||
if(!module.importLibrary)
|
||||
return None;
|
||||
|
||||
size_t index = module.importLibrary->source->name.rfind ( ".spec" );
|
||||
return ( index != string::npos );
|
||||
if(module.importLibrary->source->name.rfind(".spec") != string::npos)
|
||||
return Spec;
|
||||
|
||||
if(module.importLibrary->source->name.rfind(".pspec") != string::npos)
|
||||
return PSpec;
|
||||
|
||||
return None;
|
||||
}
|
||||
|
||||
/* caller needs to delete the returned object */
|
||||
@@ -2189,11 +2198,11 @@ MingwModuleHandler::GetDefinitionFilename () const
|
||||
if ( module.importLibrary == NULL )
|
||||
return NULL;
|
||||
|
||||
if ( IsWineModule () )
|
||||
if ( IsSpecDefinitionFile () )
|
||||
{
|
||||
return new FileLocation ( IntermediateDirectory,
|
||||
module.importLibrary->source->relative_path,
|
||||
GetBasename ( module.importLibrary->source->name ) + "_" + module.name + ".spec.def" );
|
||||
GetBasename ( module.importLibrary->source->name ) + "_" + module.name + ".auto.def" );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2268,7 +2277,7 @@ MingwModuleHandler::GetSpecImplibDependencies (
|
||||
{
|
||||
dependencies.push_back ( FileLocation ( IntermediateDirectory,
|
||||
file->relative_path,
|
||||
GetBasename ( file->name ) + "_" + module.name + ".spec.def" ) );
|
||||
GetBasename ( file->name ) + "_" + module.name + ".auto.def" ) );
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2316,9 +2325,11 @@ MingwModuleHandler::GetDefinitionDependencies (
|
||||
const CompilationUnit& compilationUnit = *compilationUnits[i];
|
||||
const FileLocation& sourceFile = compilationUnit.GetFilename ();
|
||||
string extension = GetExtension ( sourceFile );
|
||||
if ( extension == ".spec" || extension == ".SPEC" )
|
||||
|
||||
if (extension == ".spec" || extension == ".pspec")
|
||||
GetSpecObjectDependencies ( dependencies, &sourceFile );
|
||||
if ( extension == ".idl" || extension == ".IDL" )
|
||||
|
||||
if (extension == ".idl")
|
||||
{
|
||||
if ( ( module.type == RpcServer ) || ( module.type == RpcClient ) || ( module.type == RpcProxy ) )
|
||||
GetWidlObjectDependencies ( dependencies, &sourceFile );
|
||||
|
||||
@@ -32,6 +32,13 @@ PrefixFilename (
|
||||
const std::string& filename,
|
||||
const std::string& prefix );
|
||||
|
||||
enum SpecFileType
|
||||
{
|
||||
None,
|
||||
Spec = 1,
|
||||
PSpec = 2
|
||||
};
|
||||
|
||||
class MingwModuleHandler
|
||||
{
|
||||
public:
|
||||
@@ -150,7 +157,7 @@ private:
|
||||
const FileLocation *file ) const;
|
||||
void GetDefaultDependencies ( string_list& dependencies ) const;
|
||||
void GetInvocationDependencies ( const Module& module, string_list& dependencies );
|
||||
bool IsWineModule () const;
|
||||
SpecFileType IsSpecDefinitionFile () const;
|
||||
const FileLocation* GetDefinitionFilename () const;
|
||||
void GenerateBuildNonSymbolStrippedCode ();
|
||||
void CleanupCompilationUnitVector ( std::vector<CompilationUnit*>& compilationUnits );
|
||||
|
||||
@@ -77,7 +77,7 @@ CompilationUnit::IsGeneratedFile () const
|
||||
return false;
|
||||
const File* file = files[0];
|
||||
string extension = GetExtension ( file->file );
|
||||
return ( extension == ".spec" || extension == ".SPEC" || extension == ".mc" || extension == ".MC");
|
||||
return ( extension == ".spec" || extension == ".pspec" || extension == ".mc");
|
||||
}
|
||||
|
||||
bool
|
||||
|
||||
Reference in New Issue
Block a user