2010-06-17 25 views
7

Por lo que entiendo en la documentación, devuelve nulo si falla, pero me parece que hay una excepción lista para cada escenario de falla.¿Cuándo Registry.CreateSubKey devuelve nulo?

¿En qué escenario estándar esta función realmente devolverá un valor nulo?

+0

extraño hecho. Si es realmente curioso, descargue Reflector, encuentre este método y vea si/cuándo devuelve nulo. Puede ser porque falla la llamada del sistema subyacente .... – Grzenio

+1

Buena idea ... Es bastante complicado seguir el método, pero termina con las siguientes dos líneas: BCLDebug.Assert (false, "Ruta del código inesperado en RegistryKey: : CreateSubKey "); return null; así que supongo que ninguna llamada "normal" debería dar como resultado un nulo. El resharper simplemente no lo ve y advierte sobre el valor de retorno nulo. Lo ignoraré sin problemas. –

Respuesta

1

Si nos fijamos en el código a través del reflector, se verá que si la devolución del método nativo Win32Native.RegCreateKeyEx() vuelve otra cosa que no sea un código de error de 0 o si el resultado de la operación es null, será luego regresar null vuelta para ti.

Una posible falla aquí es si se usan los permisos incorrectos, lo que hace que se devuelva un código de error de acceso denegado.

El código detrás de este método es el siguiente:

[ComVisible(false)] 
public unsafe RegistryKey CreateSubKey(string subkey, RegistryKeyPermissionCheck permissionCheck, RegistrySecurity registrySecurity) 
{ 
    ValidateKeyName(subkey); 
    ValidateKeyMode(permissionCheck); 
    this.EnsureWriteable(); 
    subkey = FixupName(subkey); 
    if (!this.remoteKey) 
    { 
     RegistryKey key = this.InternalOpenSubKey(subkey, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree); 
     if (key != null) 
     { 
      this.CheckSubKeyWritePermission(subkey); 
      this.CheckSubTreePermission(subkey, permissionCheck); 
      key.checkMode = permissionCheck; 
      return key; 
     } 
    } 
    this.CheckSubKeyCreatePermission(subkey); 
    Win32Native.SECURITY_ATTRIBUTES structure = null; 
    if (registrySecurity != null) 
    { 
     structure = new Win32Native.SECURITY_ATTRIBUTES(); 
     structure.nLength = Marshal.SizeOf(structure); 
     byte[] securityDescriptorBinaryForm = registrySecurity.GetSecurityDescriptorBinaryForm(); 
     byte* pDest = stackalloc byte[1 * securityDescriptorBinaryForm.Length]; 
     Buffer.memcpy(securityDescriptorBinaryForm, 0, pDest, 0, securityDescriptorBinaryForm.Length); 
     structure.pSecurityDescriptor = pDest; 
    } 
    int lpdwDisposition = 0; 
    SafeRegistryHandle hkResult = null; 
    int errorCode = Win32Native.RegCreateKeyEx(this.hkey, subkey, 0, null, 0, GetRegistryKeyAccess(permissionCheck != RegistryKeyPermissionCheck.ReadSubTree), structure, out hkResult, out lpdwDisposition); 
    if ((errorCode == 0) && !hkResult.IsInvalid) 
    { 
     RegistryKey key2 = new RegistryKey(hkResult, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree, false, this.remoteKey, false); 
     this.CheckSubTreePermission(subkey, permissionCheck); 
     key2.checkMode = permissionCheck; 
     if (subkey.Length == 0) 
     { 
      key2.keyName = this.keyName; 
      return key2; 
     } 
     key2.keyName = this.keyName + @"\" + subkey; 
     return key2; 
    } 
    if (errorCode != 0) 
    { 
     this.Win32Error(errorCode, this.keyName + @"\" + subkey); 
    } 
    return null; 
} 
Cuestiones relacionadas