1

Nous essayons de Memory Mapping File Technique de partager des informations sur les processusWin32API.OpenFileMapping Lancers Violation d'accès Exception depuis IE ToolBar

Mais quand nous utilisons cela dans l'un de nos composants qui est IE Toolbar il jette une violation d'accès exception lorsque IE fonctionne en mode protégé.

Quelqu'un peut-il m'aider à cet égard ??.

En cas de solution de rechange à partager memroy dans les processus multiples par lesquels IE ne pose aucun problème lors de l'exécution en mode protégé, s'il vous plaît partager également

scénario détaillé est déjà expliqué here Merci

Répondre

2

Pas de réponse Encore???

Quoi qu'il en soit, j'ai trouvé la solution, nous devons d'abord comprendre le problème.

Lorsque IE s'exécute en mode protégé, le processus IE prend le niveau Low-Integrity pour éviter l'utilisation d'objets sécurisés d'IE. Par conséquent, si un objet Kernal (fichier de mappage de mémoire) est créé dans le processus Highty-Integrity (par exemple à partir d'une application de console ou de fenêtre), il ne sera pas accessible à partir de l'IE lorsqu'il est en mode protégé. Donc, pour faire ce travail, il faut marquer le niveau Kernal Object à Low-Integrity du processus high-Integrity, cet objet sera également accessible à partir de processus de bas niveau d'intégrité, bien qu'il rende l'objet vulnérable.

après une longue recherche je l'ai trouvé (here) ce qui suit le code de VC pour définir un objet Kernal au niveau faible intégrité:

LPCWSTR LOW_INTEGRITY_SDDL_SACL_W = L"S:(ML;;NW;;;LW)"; 

bool SetObjectToLowIntegrity(HANDLE hObject, SE_OBJECT_TYPE type = SE_KERNEL_OBJECT)  
{ 
    bool bRet = false; 
    DWORD dwErr = ERROR_SUCCESS; 
    PSECURITY_DESCRIPTOR pSD = NULL; 
    PACL pSacl = NULL; 
    BOOL fSaclPresent = FALSE; 
    BOOL fSaclDefaulted = FALSE; 

     if (ConvertStringSecurityDescriptorToSecurityDescriptorW (LOW_INTEGRITY_SDDL_SACL_W, SDDL_REVISION_1, &pSD, NULL)) 
     { 
     if (GetSecurityDescriptorSacl (
       pSD, &fSaclPresent, &pSacl, &fSaclDefaulted)) 
      { 
      dwErr = SetSecurityInfo (
        hObject, type, LABEL_SECURITY_INFORMATION, 
        NULL, NULL, NULL, pSacl); 

      bRet = (ERROR_SUCCESS == dwErr); 
      } 

     LocalFree (pSD); 
     } 

     return bRet; 
    } 

pour le rendre réalisable en C# je me suis converti au-dessus des fenêtres Apis en C# comme suit;

public const int LABEL_SECURITY_INFORMATION = 0x00000010; 

    public enum SE_OBJECT_TYPE 
     { 
      SE_UNKNOWN_OBJECT_TYPE = 0, 
      SE_FILE_OBJECT, 
      SE_SERVICE, 
      SE_PRINTER, 
      SE_REGISTRY_KEY, 
      SE_LMSHARE, 
      SE_KERNEL_OBJECT, 
      SE_WINDOW_OBJECT, 
      SE_DS_OBJECT, 
      SE_DS_OBJECT_ALL, 
      SE_PROVIDER_DEFINED_OBJECT, 
      SE_WMIGUID_OBJECT, 
      SE_REGISTRY_WOW64_32KEY 
     } 

public static bool SetLowIntegrityLevel(IntPtr hObject) 
     { 
      bool bResult = false; 
      IntPtr pSD = IntPtr.Zero; 
      IntPtr pSacl = IntPtr.Zero; 
      IntPtr lpbSaclPresent = IntPtr.Zero; 
      IntPtr lpbSaclDefaulted = IntPtr.Zero; 
      uint securityDescriptorSize = 0; 

      if (ConvertStringSecurityDescriptorToSecurityDescriptorW("S:(ML;;NW;;;LW)", 1, ref pSD, ref securityDescriptorSize)) 
      { 
       if (GetSecurityDescriptorSacl(pSD, out lpbSaclPresent, out pSacl, out lpbSaclDefaulted)) 
       { 
        int result = SetSecurityInfo(hObject, 
                SE_OBJECT_TYPE.SE_KERNEL_OBJECT, 
                LABEL_SECURITY_INFORMATION, 
                IntPtr.Zero, 
                IntPtr.Zero, 
                IntPtr.Zero, 
                pSacl); 
        bResult = (result == 0); 
       } 
       LocalFree(pSD); 
      } 

      return bResult; 
     } 

[DllImport("Advapi32.dll", EntryPoint = "SetSecurityInfo")] 
     public static extern int SetSecurityInfo(IntPtr hFileMappingObject, 
                SE_OBJECT_TYPE objectType, 
                Int32 securityInfo, 
                IntPtr psidOwner, 
                IntPtr psidGroup, 
                IntPtr pDacl, 
                IntPtr pSacl); 

     [DllImport("advapi32.dll", EntryPoint = "GetSecurityDescriptorSacl")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern Boolean GetSecurityDescriptorSacl(
      IntPtr pSecurityDescriptor, 
      out IntPtr lpbSaclPresent, 
      out IntPtr pSacl, 
      out IntPtr lpbSaclDefaulted); 

     [DllImport("advapi32.dll", EntryPoint = "ConvertStringSecurityDescriptorToSecurityDescriptorW")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern Boolean ConvertStringSecurityDescriptorToSecurityDescriptorW(
      [MarshalAs(UnmanagedType.LPWStr)] String strSecurityDescriptor, 
      UInt32 sDRevision, 
      ref IntPtr securityDescriptor, 
      ref UInt32 securityDescriptorSize); 

     [DllImport("kernel32.dll", EntryPoint = "LocalFree")] 
     public static extern UInt32 LocalFree(IntPtr hMem);