Eu estava tentando descobrir o formato binário dos valores na chave DisabledItems e o seu post aqui me colocou no caminho certo. No entanto, acho que o formato é um pouco diferente de como você o vê, pelo menos no Office 2010.
Tanto quanto eu posso dizer o formato é assim:
-
Os primeiros quatro bytes são um inteiro de 32 bits. Geralmente parece ter o valor 1. Não sei qual é o propósito dele.
-
Os próximos quatro bytes são um inteiro de 32 bits que nos informa o comprimento do caminho da dll em bytes, incluindo o caractere de terminação (nulo ou 0x0000).
-
Os próximos quatro bytes são um inteiro de 32 bits que nos informa o tamanho do nome amigável em bytes, incluindo o caractere de terminação (nulo ou 0x0000).
-
A próxima seqüência de bytes é uma cadeia unicode big endian com terminação nula contendo o caminho para a dll do suplemento. Por alguma razão, este caminho sempre parece conter apenas caracteres minúsculos.
-
A próxima seqüência de bytes é uma cadeia unicode big endian com terminação nula contendo o nome amigável do suplemento.
Eu consegui desativar com êxito um suplemento usando o seguinte código C #:
string path = "<full path to add-in dll>".ToLower();
string friendlyName = "<add-in friendly name>";
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(1); // Unknown
writer.Write((path.Length * 2) + 2); // Path length, 2 bytes per character
writer.Write((friendlyName.Length * 2) + 2); // Friendly name length
writer.Write(Encoding.Unicode.GetBytes(path)); // Path
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Write(Encoding.Unicode.GetBytes(friendlyName)); // Friendly name
writer.Write(Convert.ToInt16(0)); // null terminator
writer.Close();
// Version numbers: 11.0 = Office 2003, 12.0 = Office 2007, 14.0 = Office 2010
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Office.0\Word\Resiliency\DisabledItems", true);
key.SetValue("63CB962", stream.ToArray(), RegistryValueKind.Binary);
key.Close();
Uma abordagem semelhante pode ser usada para decodificar o caminho dll de um valor existente da seguinte forma:
// Let 'bytes' be a byte array containing the binary registry value
BinaryReader binaryReader = new BinaryReader(new MemoryStream(bytes));
binaryReader.ReadInt32(); // Read the first four bytes and ignore
int pathLength = binaryReader.ReadInt32(); // The next four bytes are the length of the path
binaryReader.Close();
if (bytes.Length >= 12 + pathLength)
{
string path = Encoding.Unicode.GetString(bytes, 12, pathLength - 2);
}