Monday, 30 December 2019

0x40000 binary options


Eu tenho dois drivers de filtro NDIS no mesmo binário. Isso parece funcionar com base neste thread do fórum MSDN. Eu encontrei um problema: Ambos os drivers foram instalados com êxito usando NetCfg API. No entanto, o segundo driver instalado não será iniciado. Ele faz com que o erro de sistema 2: Se eu instalar o npcapwifi primeiro, npcap segundo, então o serviço npcap falha ao iniciar. DbgView mostra que os drivers DriverEntry segundo nunca é chamado. E a instalação da API NetCfg não mostra nenhum erro. Então eu não sei o que está errado aqui Obrigado Os drivers primeiro INF é: npcap. inf. Ele usa o nome do serviço npcap. O segundo driver INF é: npcapwifi. inf Ele usa o nome do serviço npcapwifi. O binário compartilhado é: Packet. c. Eu usei DriverEntry s RegistryPath para determinar qual serviço o binário está sendo executado como. O instalador do driver é: NPFInstall. cpp. O comando NPFInstall. exe - i é usado para instalar o primeiro driver e NPFInstall. exe - i2 é usado para instalar o 2º driver. Eu modifiquei npcap. inf com base no seu método de serviço falso: E meu código de instalador é alterado para: E o resultado é o segundo serviço npcapwifi acaba com erro de sistema 2: Isso parece certo A questão é que eu ainda não recebo a chamada DriverEntry Para o segundo LWF no DbgView Então, como o 2 º trabalho LWF, então eu acho que isso é o que eu deveria fazer em seguida Eu chamei NdisFRegisterFilterDriver duas vezes no meu DriverEntry para registrar 2 LWFs. As estruturas 2 FChars apenas diferem em FriendlyName, UniqueName, ServiceName. Mas o segundo NdisFRegisterFilterDriver sempre falha com NDISSTATUSFAILURE (0xc0000001). Eu não sei porquê. Para a segunda LWF, eu usei o 1o LWFs ServiceName (npcap), ou usado seu próprio npcapwifi. Nem funciona. Eu analisei o rastreamento do WPP, ele mostra: Então parece que o NDIS não encontrou o segundo filtro de registro 7daf2ac8-e9f6-4765-a842-f1f5d2501351. Mas eu chequei no regedit. Ele tem essa chave: Então eu não sei por que NDIS relatórios NdisFRegisterFilterDriver: Não é possível encontrar o filtro 7daf2ac8-e9f6-4765-a842-f1f5d2501351 no registro. O INetCfg instalou este filtro com êxito. Uma imagem binária (arquivo. sys) só pode ser carregada pelo sistema uma vez de cada vez. Você não pode carregar a mesma imagem simultaneamente para dois serviços diferentes. (Nem você pode carregá-lo uma vez para um serviço, e uma vez para um driver PNP.) Isso significa que você sempre verá DriverEntry. DriverUnload. DriverEntry. DriverUnload. Você nunca verá DriverEntry. DriverEntry. DriverUnload. DriverUnload. Usando um serviço falso Cada NDIS LWF ou driver de protocolo precisa de um serviço, para armazenar algumas chaves de registro. Mas heres o primeiro truque: o serviço não precisa ser executado Você pode criar um registro de serviço fictício para um LWF, em seguida, ter algum outro serviço realmente usar o LWF. NDIS não validar o ServiceName você passar para NdisFRegisterFilterDriver. (E sim, está tudo bem para contar com esse truque. Eu falo com a autoridade do proprietário do NDIS na Microsoft.) Há drivers embutidos que fazem exatamente isso. Olhe TCPIP e TCPIP6. Estes são dois serviços diferentes, e também dois drivers de protocolo diferentes, mas apenas uma imagem (tcpip. sys). O serviço TCPIP é o serviço real mdash ele realmente será iniciado na inicialização. O serviço TCPIP6 é falso mdash é marcado para nunca começar, e se você tentar iniciar manualmente, ele não vai funcionar. (Além: não use WFPLWFS como um exemplo. Mas ele também tem 3 drivers de filtro compartilhamento 1 binário, ele faz algo diferente que resultaria em alguns problemas se você tentou fazê-lo. Além disso, começando com o Windows 10, o INFs usado por TCPIP e TCPIP6 são tipo de falso, então você shouldnt supor que theyre bons exemplos de como fazer este truque.) Você pode opcionalmente registrar tudo isso com 1 INF ou 2 INFs não faz muita diferença para o sistema operacional. Vamos dizer 1 INF, apenas para manter o exemplo mais curto. Então, o que você precisa é: LWF chamado FilterA LWF chamado FilterB Serviço chamado ServiceA Serviço chamado ServiceB Driver imagem chamada Driver. sys INF nomeado Driver. inf Vamos dizer que ServiceA é o serviço real e ServiceB é o serviço falso. Driver. inf teria: Observe que você registrar 2 LWFs, criar 2 serviços e copiar 1 imagem. Você instala isso com 1 chamada para SetupCopyOEMInf e 2 chamadas para INetCfgClassSetup :: Install. Para cada um de myfiltera e myfilterb. Para iniciar o driver, apenas iniciar 1 serviço, ServiceA. Nunca inicie o outro serviço fictício. Mas e se você não quer ambos os filtros em execução ao mesmo tempo Easy mdash não chamar NdisFRegisterFilterDriver até que você queira o LWF para realmente ser iniciado. Você sempre pode registrar / desregistar seu driver de filtro de um manipulador ioctl. Portanto, o DriverEntry seria bastante vazio mdash basta criar um dispositivo objeto para ouvir ioctls. Usando um driver de exportação Uma opção diferente é criar 2 serviços que cada um tem sua própria imagem de driver. Mas a imagem do driver seria um invólucro fino em torno de uma chamada para um único driver de exportação compartilhado (como uma DLL). Você pode colocar todo o seu trabalho real nesse driver de exportação compartilhado. Isso mantém simples, embora ele acabar com uma pilha de drivers extras. Contém várias ferramentas que ajudam a criar a imagem: genpart: gera a tabela de partição Allwinner extractfwblobs. sh: extrai os blobs de firmware Allwinner de uma imagem existente boot0img: monta ARM Firmware confiável, U-Boot e potencialmente o binário SCP em uma imagem que será aceita pelo carregador boot0 da Allwinners A ferramenta boot0img toma vários bits de firmware compilados e os monta em uma imagem que será aceita pelo carregador boot0 da Allwinners. Boot0 é um carregador de programa inicial, que será carregado pelo código BROM. Existem várias versões, taylored para o meio que eles carregam de - (e) cartão MMC / SD, flash NAND, flash SPI. A principal tarefa do boot0 é inicializar o SoC, o mais importante é o controlador DRAM. Em seguida, carrega os bits de firmware secundário (por exemplo, U-Boot) de uma mídia de inicialização (por exemplo, um cartão SD) em DRAM e os executa. O firmware Allwinner original consiste de: Um binário U-Boot (com DTB), carregado a 160MB em DRAM. O firmware do arisco, carregado na SRAM A2 (0x40000). Um binário ARM Trusted Firmware (ATF), carregado no início da DRAM. A ferramenta boot0img leva arquivos binários para cada um dos três componentes e os compõe em uma imagem, preenchendo corretamente os campos de cabeçalho necessários e calculando a soma de verificação obrigatória. Algumas opções permitem desviar mais facilmente da configuração original do firmware Allwinners e do layout da inicialização: por exemplo, em vez do firmware do controlador arisc, o binário de firmware ARM Trusted pode ser gravado na SRAM A2 e executado a partir daí. Algumas opções fornecem automaticamente código de trampolim para simplificar o uso de um layout de firmware diferente. Se você passar um nome de arquivo de imagem boot0 para a ferramenta (-b - boot0). Ele criará uma imagem que pode ser gravada diretamente em um cartão SD. Caso contrário apenas o blob com as peças do firmware secundário será montado. Passando - B em vez disso, o patch boot0 será carregado para carregar o restante dos bits do firmware abaixo do primeiro MB do cartão uSD. Em vez de um binário real para a DRAM, você pode escrever ARM ou código trampolim AArch64 nesse local. Ele saltará para o endereço especificado. Especificar um endereço de entrada de arisco (-a) preencherá o vetor de exceção de restauração de arisco com uma instrução OpenRISC para saltar para esse endereço especificado. O dado SRAM binário será, portanto, escrito atrás da área vetorial exceção. Para montar uma imagem de firmware tradicional baseada no Allwinner, use: Para montar uma imagem com um U-Boot de 64 bits, um ATF em execução em SRAM e nenhum código de arisc em tudo, também tem uma tabela de partição pristine com uma partição de boot de 100 MB, Use: Isso irá carregar o binário U-Boot para 0x4a000000 como de costume, mas coloca o binário ATF no SRAM A2 local (onde o binário arisc normalmente vive). Boot0 não sabe sobre isso, então vai redefinir o núcleo arisc de qualquer maneira e ele vai começar a executar a partir do vetor de exceção. Assim, o binário ATF vem com algum código OpenRISC que simplesmente pára a CPU, cujo endereço está em 8 bytes, então nós definimos o vetor de restauração de arisco para saltar para o endereço 0x44008: 0x40000 (base de SRAM A2, vetores de exceção de arisco) 0x4000 (tamanho do intervalo de vetores de exceção) 8. Se usarmos a opção - a, a ferramenta moverá automaticamente a carga real atrás dos vetores de exceção de arisco (preenchendo 16KB de zeros, deixando de fora o vetor de exceção de reset). Agora nós não temos realmente nada para correr no início da DRAM, mas boot0 saltará lá de qualquer maneira, então nós colocamos o código trampolim AArch64 lá que nos leva para o código ATF real que queremos executar. Para montar uma imagem com um U-Boot de 64 bits colado a um ATF rodando em DRAM e ao código normal arisc: GNU binutils patches FR80 patch de processador Opções de linha de comando Fornece as seguintes opções de linha de comando no GAS para arquitetura FR30: Last Opção fornece verificações a seguir: variáveis ​​de byte / constantes no segmento de código produzem um aviso todas as palavras / palavras de palavra e palavra são garantidas para serem alinhadas a 2 ou 4 bytes respectivamente Exemplos de uso desmontar o programa de montagem de amostra de firmware test. s: FR80 para arquivo de objeto (relocável) desmontar arquivo de objeto arquivo firmware para ELF executável (não relocável) converter ELF executável para arquivo binário Acessando dados FR80 processador não tem instruções para acesso direto aos dados. Somente o endereçamento indireto é possível: o endereço de dados deve ser carregado primeiro no registrador. As regras de alinhamento aplicam-se ao acesso a dados (ver abaixo). Problemas de alinhamento As seguintes regras aplicam-se ao FR80: o código de instrução de deve ser colocado sempre com 2 bytes alinhados. O endereço de dados para as instruções de palavra (32 bits) deve estar sempre alinhado com 4 bytes. O endereço de dados para instruções de meia-palavra (16 bits) deve estar sempre alinhado com 4 bytes. Se o endereço do código for irregular: No momento da execução da instrução, bit0 do contador de programa (PC) automaticamente se torna 0, e está sempre em um endereço par. Se o endereço especificado não for um múltiplo de 4, os dois bits inferiores do endereço não serão ajustados forçosamente a 00. Não há garantia de operação quando o endereço especificado não é um múltiplo de 4. --- Fujitsu: FR80 Família Manual de programação, 2.3.2 GAS foi projetado para fornecer qualquer uso possível e confiar que o usuário sabe como corrigir alinhar. GNU C compilador (GCC) que usa GAS para montagem, produz sempre correto alinhamento. FR80 não geram exceção de dados não alinhados no caso de erro. Isso faz com que encontrar esses lugares no trabalho de código realmente doloroso. Portanto, você é fortemente aconselhado a usar a opção GEN --enforce-aligned-data. ADVERTÊNCIA 1: O GAS não verifica o endereço de dados no registrador para ser alinhado. AVISO 2: O GAS não alinha automaticamente os dados. AVISO 3: O NikonEmulator tem, no momento, nenhuma verificação de tempo de execução160. Portanto, executar o código no Emulator não significa que o alinhamento está correto. GAS para FR30 / FR80 não reordenar dados ou código. Portanto, as diretivas apropriadas não são implementadas: AVISO: Por favor, não misture isso com a diretiva: Não tem nada em comum com o alinhamento. Criando binutils para processador FR80 Leia isto somente se você quiser compilar binutils para FR80 a partir do código-fonte. Depois de ter EXEs, você não precisa MinGW / MSYS e outros pacotes mais. No Windows: instale MSYS / MinGW Isso é necessário apenas para a construção de binutils. Baixe e instale MSYS 1.0.11 de downloads. sourceforge. net/project/mingw/ Isso fornecerá make, sh e todas as outras ferramentas necessárias para construir na plataforma Windows. Edite msys1.0etcfstab para incluir as seguintes linhas: Você pode colocar aqui seus pathes para o compilador MingGW eo diretório de origem, mas os espaços não são permitidos no caminho. Baixar e instalar / descompactar MinGW GCC compilador 3.4.5 para Windows e binutils para Windows: Download patch Aplicar patch Download GNU binutils 2.22 e extrair para o seu diretório de origem (geralmente /src/binutils-2.22/.). Faça o download do patch e salve-o no diretório pai do binutils. No seu sh-shell mude para o diretório onde o subdiretório binutils-2.22 existe: Você pode testar se o patch pode ser aplicado por comando (sem realmente mudar arquivos): Saída normal sem erros, se parece com: Em vez disso tr - dr lt fr80-binutils-2.22.pat patch - p2) Compilar binutils set timezone correto por ou adicionar este comando para o arquivo de inicialização /.profile para MSYS shell iniciar MSYS: digite msys terminal Este será o seu diretório de compilação. Configure binutils Cria Makefile no diretório atual para construir o destino fr30-elf com o diretório de instalação c: mingwfr30-elf eo suporte à internacionalização desativada. Construir e instalar binários executáveis ​​de tira, porque eles contêm muita informação de depuração e tabela de símbolo completo: Q: Qual plataforma foi usada para criar patch160 A: Estou realmente feliz que temos MinGW - obrigado guys É excelente e torna a vida mais fácil para Desenvolvedores multi-plataforma. Agora, todos podem participar no desenvolvimento de praticamente qualquer alvo. Todas as instruções foram testadas na plataforma MinGW / MSYS. P: Por que a opção de auto-alinhamento não foi implementada160 A: As diretrizes GAS. align /.palign /.balign são muito complexas e poderosas. A melhor maneira de implementar o recurso de auto-alinhamento é chamar salign () intern para cada comando no assembler do FR30 / FR80. Isso será emular como diretivas acima foi encontrado no fluxo de assembler de entrada. Mas isso não é possível, por causa do design interno. Na verdade, vários montadores já o chamam de maneira muito feia. É demasiado complicado, unflexible e buggy se cada assembler da CPU em binutils terá a própria versão da aplicação. align /.palign /.balign. Por outro lado, o compilador do GCC não precisa de auto-alinhamento. Alinha os dados por si só. P: Por que tantas variáveis ​​estáticas são usadas no patch160 A: Essa é a única maneira que você tem, porque as informações de contexto não são passadas para callbacks implementadas para cada assembler de CPU particular. Não é uma melhor escola de design de software, mas todas as fontes binutils usam muitas variáveis ​​estáticas. Na verdade, a biblioteca binutils é projetada para um único processador, uma única tarefa e um único trabalho. Por exemplo, você não pode desmontar dois binários diferentes ao mesmo tempo, mesmo se você usar um processador e apenas ter uma tarefa em seu aplicativo. P: Por que não há teste de GAS para FR80160 A: Mesmo que eu faça um com CGEN, a maioria das pessoas não será capaz de usá-lo. Você precisa DeJaGNU para executar testsuite que por sua vez precisa Exact e Tcl / Tk. No momento em que este patch foi criado Exact e DeJaGNU não foram compiláveis ​​na plataforma MinGW. Se você encontrar o caminho, me avise. Q: E quanto a macro commands160 A: Eu não sei se alguém, exceto eu usa FR80 assembler160 :) Então eu não tenho idéia de quais são usados ​​nesta plataforma, exceto ldi8 existente, ldi20, ldi32 que são realmente sinônimos de ldi: 8, ldi : 20, ldi: 32. Esses foram definidos para tornar a vida mais fácil para os usuários do Emacs. Q: Qualquer detalhes sobre implementation160 A: Assembler / disassembler para FR30 são implementados como descrição formal da CPU escrita em Scheme (fr30.cpu com helper fr30.opc). É traduzido pelo CGEN em código C. A maioria das instruções do FR80 são iguais ao FR30, mas existem algumas novas e únicas, e algumas outras que estão obsoletas. Essas diferenças foram implementadas em arquivos Scheme, adicionando novos mach e introduzindo atributos de instrução que permitem a separação de opcodes com base no tipo de máquina. Também foram adicionadas opções de linha de comando para o tipo de máquina de comutação, verificação de alinhamento e novas bandeiras de cabeçalho ELF para FR80. Q: Eu tenho mais questions160 A: Basta publicá-los em nossos fóruns.

No comments:

Post a Comment