Compartilhar via


Modified Kernel APIs

Windows Mobile Not SupportedWindows Embedded CE Supported

9/8/2008

A seguinte tabela mostra o kernel APIs que foram modificados para Windows Embedded CE 6.0e compara a modificação com a funcionalidade de Windows CE 5.0.

Função Windows CE 5.0 CE 6.0

ActivateDevice

ActivateDeviceEx

Driver que está carregando sinalizadores não conta para Drivers kernel - modo ou usuário - modo.

Conta sinalizadores Driver-Loaded para Drivers kernel - modo e usuário - modo.

CeGetCallerTrust

CeGetCurrentTrust

Essas funções verificar a nível de confiabilidade do processo.

A de confiança-nível mecanismo é obsoleto. Os aplicativos são sempre de confiança no modo kernel e não confiáveis em modo de usuário. Em CE 6.0, todos os aplicativos que têm permissão para executar são considerados de confiança.

CreateFiber

Um segmento não pôde ser convertido em uma fibra se o tamanho pilha do segmento era diferente do tamanho pilha usar como padrão processo definido pelo vinculador de /STACK configuração.

Um segmento pode ser convertido em uma fibra, mesmo se o tamanho pilha do segmento for diferente do tamanho pilha usar como padrão processo definido pelo vinculador de /STACK configuração.

File Mapping Functions:

CreateFileForMapping

CreateFileMapping

FlushViewOfFile

MapViewOfFile

UnmapViewOfFile

Arquivos de memória mapeada são mapeados em um espaço de endereço compartilhada.

De exemplo, em Windows CE 5.0, um objeto arquivo Memory-mapped, que foi aberto pelo kernel e por aplicativos foi acessado por todos os processos no mesmo endereço.

Arquivos mapeados na memória são mapeados na espaço de endereço do processo, portanto, não é possível transmitir arquivo Memory-mapped ponteiros entre processos. Cada processo deve aberto o arquivo Memory-mapped.

Um arquivo Memory-mapped RAM-backed não é associado com um arquivo real. Se dois usuário-modo processos aberto o mesmo RAM-backed Memory-mapped arquivo, eles get o mesmo endereço porque aplicativos podem usar auto-referência ponteiros na reserva. Se o mapeamento é compartilhado entre modo kernel e modo usuário, o kernel - modo exibição é em um endereço diferente do que o usuário-modo exibição. Se o mapeamento é arquivo-feito, o mapeamento pode ser localizado em um endereço diferente em um processo que em outro processo, ou mesmo entre dois usuário-modo processos. Portanto, em vez de armazenar ponteiros no mapeamento, você deve usar deslocamentos reserva para referir aos locais dentro de mapeamento.

Em Windows Embedded CE 6.0, deslocamento reserva valores, em vez ponteiros, são usados para acessar o ativo dados.

CreateMsgQueue

O gerenciado fila de mensagens a criação de nomeado mensagem filas e a controlar mantém fila de mensagens do número de leitores e gravadores na estrutura MSGQUEUEINFO. Alças eram referência contada.

Sinalizadores enviada para CreateMsgQueue não foi validado.

A infra-estrutura identificador gerencia as filas mensagem. Para nomeado mensagem filas, separar dois eventos são exigido, portanto, a ler e gravação termina do nomeado fila de mensagens são prefixado com "r:" e "w:". A conta para o "r:" ou "w:" Em Comprimento de fila de mensagens, o lpszName parâmetro não pode ser definido para um tamanho maior que (MAX_PATH - 2).

Os parâmetros para essa função são validados para que se CreateMsgQueue é chamado com sinalizadores Other Than MSGQUEUE_NOPRECOMMIT ou MSGQUEUE_ALLOW_BROKEN, o chamar falha e o último erro é definido como ERROR_INVALID_PARAMETER.

CreateProcess

Um aplicativo que chamado de CreateProcess função tinha acesso completo ao identificador de processo que foi criado.

A funcionalidade padrão permitido o aplicativo que chamado CreateProcess Para que acesso completo ao identificador de processo que foi criado.

Como privilégios API não estão implementados, processo e segmento alças retornado a partir CreateProcess Chamadas são alças reais que você pode usar em outro processo-chama relacionado, como TerminateProcess, ReadProcessMemorye WriteProcessMemory. O seguinte período processo mantém a codificar trabalhando, mesmo em lançamentos no qual API privilégios podem ser habilitado:

  • Após um bem-sucedido chamar para CreateProcess, fechar o identificador processo e segmento.
  • Faça um chamar para OpenProcess e OpenThread usando o processo e segmento identificador que é retornado na estrutura PROCESS_INFORMATION.
  • Use o identificador retornado pelo OpenProcess e OpenThread Para chamar em outro processo-relacionado e segmento-relacionado APIs.

O processo e segmento alças que são retornadas por CreateProcess Pode ser usado somente para sinalização finalidades, como espera com WaitForSingleObject, WaitForMultipleObjectse ResumeThread. Este processo ou segmento wait-only identificador também pode ser usado para consultar a codificar sair do processo ou segmento com o GetExitCodeProcess e as funções GetExitCodeThread. Para get um identificador com acesso completo para o objeto processo, você deve chamar OpenProcess com identificador de processo. No entanto, OpenProcess Requer o chamador tenha privilégios API para acessar o processo que está sendo aberto, portanto, ele pode não ser possível para todos os chamadores para aberto o processo.

Os processo e segmento alças são retornadas na estrutura PROCESS_INFORMATION. Funções such as ReadProcessMemory WriteProcessMemorye TerminateProcess devem usar o identificador que é retornado pelo OpenProcess.

Isso impede que um aplicativo não confiável de acesso completo ao identificador de processo da de confiança aplicativo em que ele foi iniciado. Para obter acessar para o espaço do processo criado, o aplicativo deve chamar o OpenProcess função para obter um identificador completo para o processo. OpenProcess Verifica a nível de confiabilidade do chamador antes de retornar um identificador para o processo.

Essa alteração permite que um aplicativo não confiável para criar uma de confiança aplicativo sem comprometer a segurança da de confiança aplicativo. De exemplo, um shell pode iniciar uma administrativo ou um digital Rights aplicativo gerenciamento (DRM) sem automaticamente dando-controle através desse aplicativo.

CreateWatchDogTimer

Se um timer de monitoria existia, o identificador para o timer de monitoria existente foi retornado, e GetLastError ERROR_ALREADY_EXISTS retornado.

Se um timer de monitoria existe, um novo identificador será retornada para o mesmo objeto, e GetLastError Retorna ERROR_ALREADY_EXISTS.

DuplicateHandle

Essa função foi duplicado manipula eventos, exclusões mútuas e semáforos.

Esta função pode duplicado todos reais alças, não apenas alças para eventos, exclusões mútuas e semáforos. Todos os identificadores reais incluem: evento alças, alças mutex API-definir alças, arquivo alças, banco de dados - arquivo alças, Alças do semáforo, memória - mapa (n.); mapear (v.) alças, alças de monitoração, processo alças, alças segmento, token alças e quaisquer identificadores gerados por um servidor identificador.

GetProcAddress

LoadLibraryEx

Se um DLL foi carregada usando LOAD_LIBRARY_AS_DATAFILE, você não foi possível obter ponteiros função dentro desse módulo. Como resultado, se a DLL foi carregado como um arquivo de dados e você chamado GetProcAddress e passado em um identificador que foi retornada por LoadLibraryEx, o ponteiro de função retornado foi NULL. Nas versões anteriores, esse cenário retornado um não-NULL ponteiro, mas usando que resultados ponteiro no indefinido comportamento e poderia possivelmente causar uma falha no segmento de chamado.

LoadLibraryEx e GetProcAddress foram alterados para levá-las em conformidade com o comportamento esperado e para evitar indefinido comportamento.

Se um DLL é carregado usando LOAD_LIBRARY_AS_DATAFILE, não é possível obter ponteiros função dentro desse módulo. Como resultado, se o DLL é carregado como um arquivo de dados e você chamar GetProcAddress e transmitir em um identificador que é retornado pela LoadLibraryEx, o ponteiro de função que é retornado é NULL.

Se você estava depender GetProcAddress Para retornar um não-NULL ponteiro para um módulo que é carregado com sinalizador LOAD_LIBRARY_AS_DATAFILE, você pode modificar a chamar como segue. Alterar:

HMODULE hmod = LoadLibraryEx(

Comentários

Para compartilhar memória entre aplicativos usuário, as possíveis soluções em CE 6.0 são o seguinte:

  • Filas de mensagens.
  • Arquivos mapeados na memória, com ou sem arquivo fazendo.
  • Remoto heap.

See Also

Concepts

Obsolete Kernel APIs
New Kernel APIs
Kernel Mode APIs

Other Resources

Kernel API Modifications: Windows CE 5.0 vs. Windows Embedded CE 6.0