[TDILIB][IPHLPAPI][WSHTCPIP]
authorThomas Faber <thomas.faber@reactos.org>
Sun, 15 Feb 2015 17:57:34 +0000 (17:57 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 15 Feb 2015 17:57:34 +0000 (17:57 +0000)
- Request only the access rights that are actually required in openTcpFile. Fixes many should-be access denied errors originating from netshell. While this doesn't fix the root cause of CORE-9172, it is a required step if we ever want netshell to work for non-Admin users.
CORE-9172

svn path=/trunk/; revision=66300

reactos/dll/win32/iphlpapi/address.c
reactos/dll/win32/iphlpapi/ifenum_reactos.c
reactos/dll/win32/iphlpapi/iphlpapi_main.c
reactos/dll/win32/iphlpapi/ipstats_reactos.c
reactos/dll/win32/iphlpapi/route_reactos.c
reactos/dll/win32/wshtcpip/wshtcpip.c
reactos/lib/tdilib/enum.c
reactos/lib/tdilib/handle.c
reactos/lib/tdilib/tdilib.h

index 9cf3af3..e340a32 100644 (file)
@@ -306,7 +306,7 @@ GetAdaptersAddresses(
         ZeroMemory(Ptr, RemainingSize);
 
     /* open the tcpip driver */
-    Status = openTcpFile(&TcpFile);
+    Status = openTcpFile(&TcpFile, FILE_READ_DATA);
     if (!NT_SUCCESS(Status))
     {
         ERR("Could not open handle to tcpip.sys. Status %08x\n", Status);
index fcaa9d0..6954848 100644 (file)
@@ -225,7 +225,7 @@ static DWORD getNumInterfacesInt(BOOL onlyNonLoopback)
     NTSTATUS status;
     int i;
 
-    status = openTcpFile( &tcpFile );
+    status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( !NT_SUCCESS(status) ) {
         WARN("getNumInterfaces: failed %08x\n", status );
@@ -350,7 +350,7 @@ const char *getInterfaceNameByIndex(DWORD index)
     IFInfo ifInfo;
     HANDLE tcpFile;
     char *interfaceName = 0, *adapter_name = 0;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( NT_SUCCESS(status) ) {
         status = getInterfaceInfoByIndex( tcpFile, index, &ifInfo );
@@ -379,7 +379,7 @@ DWORD getInterfaceIndexByName(const char *name, PDWORD index)
 {
     IFInfo ifInfo;
     HANDLE tcpFile;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( NT_SUCCESS(status) ) {
         status = getInterfaceInfoByName( tcpFile, (char *)name, &ifInfo );
@@ -400,7 +400,7 @@ InterfaceIndexTable *getInterfaceIndexTableInt( BOOL nonLoopbackOnly ) {
   IFInfo *ifInfo;
   InterfaceIndexTable *ret = 0;
   HANDLE tcpFile;
-  NTSTATUS status = openTcpFile( &tcpFile );
+  NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
   if( NT_SUCCESS(status) ) {
       status = getInterfaceInfoSet( tcpFile, &ifInfo, &numInterfaces );
@@ -476,7 +476,7 @@ DWORD getAddrByIndexOrName( char *name, DWORD index, IPHLPAddrType addrType ) {
     NTSTATUS status = STATUS_SUCCESS;
     DWORD addrOut = INADDR_ANY;
 
-    status = openTcpFile( &tcpFile );
+    status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( NT_SUCCESS(status) ) {
         status = getIPAddrEntryForIf( tcpFile, name, index, &ifInfo );
@@ -527,7 +527,7 @@ DWORD getInterfacePhysicalByName(const char *name, PDWORD len, PBYTE addr,
 {
     HANDLE tcpFile;
     IFInfo info;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( NT_SUCCESS(status) ) {
         status = getInterfaceInfoByName( tcpFile, (char *)name, &info );
@@ -544,7 +544,7 @@ DWORD getInterfacePhysicalByIndex(DWORD index, PDWORD len, PBYTE addr,
 {
     HANDLE tcpFile;
     IFInfo info;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( NT_SUCCESS(status) ) {
         status = getInterfaceInfoByIndex( tcpFile, index, &info );
@@ -581,7 +581,7 @@ DWORD getInterfaceEntryByName(const char *name, PMIB_IFROW entry)
 {
     HANDLE tcpFile;
     IFInfo info;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     TRACE("Called.\n");
 
@@ -606,7 +606,7 @@ DWORD getInterfaceEntryByIndex(DWORD index, PMIB_IFROW entry)
 {
     HANDLE tcpFile;
     IFInfo info;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     TRACE("Called.\n");
 
@@ -641,7 +641,7 @@ NTSTATUS addIPAddress( IPAddr Address, IPMask Mask, DWORD IfIndex,
                        PULONG NteContext, PULONG NteInstance )
 {
   HANDLE tcpFile;
-  NTSTATUS status = openTcpFile( &tcpFile );
+  NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA );
   IP_SET_DATA Data;
   IO_STATUS_BLOCK Iosb;
 
@@ -682,7 +682,7 @@ NTSTATUS addIPAddress( IPAddr Address, IPMask Mask, DWORD IfIndex,
 NTSTATUS deleteIpAddress( ULONG NteContext )
 {
   HANDLE tcpFile;
-  NTSTATUS status = openTcpFile( &tcpFile );
+  NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA );
   IO_STATUS_BLOCK Iosb;
 
   TRACE("Called.\n");
index d7cfa5b..9cfcd0d 100644 (file)
@@ -2145,7 +2145,7 @@ DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW pArpEntry)
   if (!pArpEntry)
       return ERROR_INVALID_PARAMETER;
 
-  if (!NT_SUCCESS(openTcpFile( &tcpFile )))
+  if (!NT_SUCCESS(openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA )))
       return ERROR_NOT_SUPPORTED;
 
   if (!NT_SUCCESS(getNthIpEntity( tcpFile, pArpEntry->dwIndex, &id )))
@@ -2312,7 +2312,7 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetAdaptersAddresses(ULONG Family,ULONG Flags,PVO
     if (!indexTable)
         return ERROR_NOT_ENOUGH_MEMORY;
 
-    ret = openTcpFile(&tcpFile);
+    ret = openTcpFile(&tcpFile, FILE_READ_DATA);
     if (!NT_SUCCESS(ret))
         return ERROR_NO_DATA;
 
index 656e00a..e416d48 100644 (file)
@@ -366,7 +366,7 @@ DWORD getNumRoutes(void)
 
     TRACE("called.\n");
 
-    status = openTcpFile( &tcpFile );
+    status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( !NT_SUCCESS(status) ) {
         TRACE("failure: %08x\n", (int)status );
@@ -421,7 +421,7 @@ RouteTable *getRouteTable(void)
     DWORD numRoutes = getNumRoutes(), routesAdded = 0;
     TDIEntityID ent;
     HANDLE tcpFile;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA );
     int i;
 
     if( !NT_SUCCESS(status) )
@@ -498,7 +498,7 @@ DWORD getNumArpEntries(void)
 
     TRACE("called.\n");
 
-    status = openTcpFile( &tcpFile );
+    status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( !NT_SUCCESS(status) ) {
         TRACE("failure: %08x\n", (int)status );
@@ -550,7 +550,7 @@ PMIB_IPNETTABLE getArpTable(void)
 
     totalNumber = getNumArpEntries();
 
-    status = openTcpFile( &tcpFile );
+    status = openTcpFile( &tcpFile, FILE_READ_DATA );
 
     if( !NT_SUCCESS(status) ) {
         TRACE("failure: %08x\n", (int)status );
index 3506044..dab80de 100644 (file)
@@ -31,7 +31,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
 
 DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
     HANDLE tcpFile;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA );
     TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
         TCP_REQUEST_SET_INFORMATION_INIT;
     IPRouteEntry *rte;
@@ -96,7 +96,7 @@ DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
 
 DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
     HANDLE tcpFile;
-    NTSTATUS status = openTcpFile( &tcpFile );
+    NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA );
     TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
         TCP_REQUEST_SET_INFORMATION_INIT;
     IPRouteEntry *rte;
index 8058599..0aeab38 100644 (file)
@@ -391,7 +391,7 @@ SendRequest(
     HANDLE TcpCC;
     DWORD BytesReturned;
 
-    if (openTcpFile(&TcpCC) != STATUS_SUCCESS)
+    if (openTcpFile(&TcpCC, FILE_READ_DATA | FILE_WRITE_DATA) != STATUS_SUCCESS)
         return WSAEINVAL;
 
     Status = DeviceIoControl(TcpCC,
@@ -449,7 +449,7 @@ WSHNotify(
 
         case WSH_NOTIFY_BIND:
             DPRINT("WSHNotify: WSH_NOTIFY_BIND\n");
-            Status = openTcpFile(&TcpCC);
+            Status = openTcpFile(&TcpCC, FILE_READ_DATA);
             if (Status != STATUS_SUCCESS)
                 return WSAEINVAL;
 
index c3122ad..7b36d4b 100644 (file)
@@ -26,7 +26,7 @@ NTSTATUS tdiGetSetOfThings( HANDLE tcpFile,
                             DWORD toiType,
                             DWORD toiId,
                             DWORD teiEntity,
-                           DWORD teiInstance,
+                            DWORD teiInstance,
                             DWORD fixedPart,
                             DWORD entrySize,
                             PVOID *tdiEntitySet,
@@ -113,7 +113,7 @@ NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile,
                                          INFO_TYPE_PROVIDER,
                                          ENTITY_LIST_ID,
                                          GENERIC_ENTITY,
-                                        0,
+                                         0,
                                          0,
                                          sizeof(TDIEntityID),
                                          (PVOID *)entitySet,
index 575c04a..f7f463f 100644 (file)
@@ -9,7 +9,7 @@
 
 const PWCHAR TcpFileName = L"\\Device\\Tcp";
 
-NTSTATUS openTcpFile(PHANDLE tcpFile)
+NTSTATUS openTcpFile(PHANDLE tcpFile, ACCESS_MASK DesiredAccess)
 {
     UNICODE_STRING fileName;
     OBJECT_ATTRIBUTES objectAttributes;
@@ -24,18 +24,12 @@ NTSTATUS openTcpFile(PHANDLE tcpFile)
                                 NULL,
                                 NULL );
 
-    status = ZwCreateFile( tcpFile,
-                           SYNCHRONIZE | GENERIC_EXECUTE |
-                           GENERIC_READ | GENERIC_WRITE,
-                           &objectAttributes,
-                           &ioStatusBlock,
-                           NULL,
-                           FILE_ATTRIBUTE_NORMAL,
-                           FILE_SHARE_READ | FILE_SHARE_WRITE,
-                           FILE_OPEN_IF,
-                           FILE_SYNCHRONOUS_IO_NONALERT,
-                           0,
-                           0 );
+    status = NtOpenFile( tcpFile,
+                         DesiredAccess | SYNCHRONIZE,
+                         &objectAttributes,
+                         &ioStatusBlock,
+                         FILE_SHARE_READ | FILE_SHARE_WRITE,
+                         FILE_SYNCHRONOUS_IO_NONALERT);
 
     /* String does not need to be freed: it points to the constant
      * string we provided */
index 1cd367d..7d32845 100644 (file)
@@ -7,7 +7,7 @@
 
 #pragma once
 
-NTSTATUS openTcpFile(PHANDLE tcpFile);
+NTSTATUS openTcpFile(PHANDLE tcpFile, ACCESS_MASK DesiredAccess);
 VOID closeTcpFile(HANDLE tcpFile);
 NTSTATUS tdiGetEntityIDSet( HANDLE tcpFile, TDIEntityID **entitySet,
                            PDWORD numEntities );