My favorites | Sign in
Project Home Downloads Wiki Issues Source
Search
for
Plugins  

Introdução

Este documento tem o objetivo de mostrar o desenvolvimento de um plugin para o lazynds, de maneira que permita a expansão das capacidades do programa no tratamento das mais diversas compressões existentes.

Príncipio de Funcionamento

O sistema de plugins do lazynds se baseia num arquivo .plg, responsável por algumas definições do plugin, e de um arquivo .py, contendo a programação do plugin.

O chamamento das funções do plugin é feito através de decorators.

Arquivo de Definição

É um arquivo texto com a extensão plg. Ele possui os seguintes parâmetros:

Module
Prefix
Type
Name
Description
Authors
Copyright
Website

Abaixo, segue a definição de cada parâmetro:

  • Module - É o nome do arquivo .py (sem extensão) que contém a programação do plugin
  • Prefix - É o prefixo usado para chamar as funções do plugin
  • Type - Que funções o plugin suporta. Os seguintes tipos são suportados: Compression-Only, Uncompression-Only, Full, Pointer-Only, Full+Pointer
    • Compression-Only - Apenas compressão
    • Uncompression-Only - Apenas descompressão
    • Full - Compressão e descompressão
    • Pointer-Only - Apenas atualização de ponteiro
    • Full+Pointer - Compressão, descompressão e atualização de ponteiro
Os demais parâmetros são as informações do plugin que serão apresentadas ao usuário final na caixa de diálogo "Sobre"

Para evitar incompatibilidades com o GTK+, todos os valores dos parâmetros devem ser informados como strings unicode.

Programação do Plugin

Todo arquivo .py deve, obrigatoriamente, importar o módulo pluginmanager, responsável por chamar as funções do plugin.

Cada função deve ser registrada através do seguinte decorator: @pluginmanager.register("XXXX-YYYY") onde XXXX é o parâmetro Prefix, definido no arquivo .plg, e YYYY pode ter os seguintes valores:

  • SCAN - Função de busca dos endereços com dados comprimidos
  • COMPRESS - Função de compressão de dados
  • UNCOMPRESS - Função de descompressão de dados
  • POINTER - Função de atualização do ponteiro

Funções auxiliares não devem ser registradas.

Todas essas quatro funções recebem uma lista e um dicionário de argumentos (definidos, respectivamente, por args e kwargs), porém, apenas o dicionário possui argumentos válidos.

Função de Busca

Recebe os seguintes argumentos:

  • kwargs["infile"] - A rom onde serão buscados os endereços com dados comprimidos. É do tipo mmap.
  • kwargs["min_size"] - O limite inferior da busca. Geralmente, o menor tamanho que o arquivo descomprimido deve ter para ser válido.
  • kwargs["max_size"] - O limite superior da busca. Geralmente, o maior tamanho que o arquivo descomprimido deve ter para ser válido.

Deve retornar o seguinte valor:

  • Uma lista contendo tuplas. Cada tupla deve conter o seguinte par: (Endereço , Prefixo)

Função de Compressão

Recebe os seguintes argumentos:

  • kwargs["infile"] - O arquivo que será comprimido. É do tipo file.

Deve retornar o seguinte valor:

  • Um buffer do tipo array de caracteres (array.array("c")) contendo o arquivo comprimido.

Função de Descompressão

Recebe os seguintes argumentos:

  • kwargs["infile"] - A rom onde o dado será descomprimido. É do tipo file.
  • kwargs["address"] - O endereço onde se encontra o dado comprimido. É do tipo long.

Deve retornar o seguinte valor:

  • Um buffer do tipo array de caracteres (array.array("c")) contendo o arquivo descomprimido.

Função de Atualização do Ponteiro

Recebe os seguintes argumentos:

  • kwargs["infile"] - A rom onde o ponteiro deverá ser procurado. É do tipo file.
  • kwargs["old_address"] - O endereço original do dado comprimido. É do tipo long.
  • kwargs["new_address"] - O novo endereço do dado comprimido. É definido na caixa de diálogo da compressão. É do tipo long.
  • kwargs["usize"] - Tamanho do dado descomprimido. É do tipo int.
  • kwargs["csize"] - Tamanho do dado comprimido. É do tipo int.

Deve retornar o seguinte valor:

  • Uma tupla contendo o seguinte par: (Valor a ser escrito , Endereço onde será escrito).
O valor a ser escrito geralmente é o novo ponteiro. Ele, obrigatoriamente, deve estar no formato de string. É recomendado usar o módulo struct para fazer as conversões. O endereço onde o novo ponteiro será escrito deve ser absoluto.

É importante notar que nenhuma das funções deve fazer modificações na ROM original, deixando isso a cargo do lazynds.

Exemplos

Estão disponíveis, junto com o lazynds, três plugins de exemplos. É recomendado usá-los para ilustrar as informações dispostas nessa documentação.


Sign in to add a comment
Powered by Google Project Hosting