Remember to maintain security and privacy. Do not share sensitive information. Procedimento.com.br may make mistakes. Verify important information. Termo de Responsabilidade
As chamadas de sistema, ou system calls, são um conceito fundamental em sistemas operacionais, permitindo que programas de usuário solicitem serviços do kernel do sistema. No ambiente Windows, as chamadas de sistema são menos expostas diretamente ao usuário em comparação com sistemas Unix-like. Em vez disso, a Microsoft proporciona APIs (Application Programming Interfaces) que encapsulam essas chamadas. Este artigo explora como utilizar essas APIs para realizar operações que, em outros sistemas, seriam feitas diretamente via chamadas de sistema.
Exemplos:
Criar um Processo:
No Windows, a criação de um processo pode ser realizada utilizando a função CreateProcess
da API do Windows.
#include <windows.h>
#include <stdio.h>
int main() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// Cria um processo filho.
if (!CreateProcess(NULL, // Nome do módulo
"C:\\Windows\\System32\\notepad.exe", // Comando a ser executado
NULL, // Atributos de segurança do processo
NULL, // Atributos de segurança da thread
FALSE, // Herança de handles
0, // Flags de criação
NULL, // Variáveis de ambiente
NULL, // Diretório atual
&si, // Ponteiro para a estrutura STARTUPINFO
&pi) // Ponteiro para a estrutura PROCESS_INFORMATION
) {
printf("CreateProcess falhou (%d).\n", GetLastError());
return -1;
}
// Aguarda a conclusão do processo filho.
WaitForSingleObject(pi.hProcess, INFINITE);
// Fecha os handles do processo e da thread.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
Ler e Escrever em Arquivos:
A leitura e escrita em arquivos no Windows podem ser feitas utilizando as funções ReadFile
e WriteFile
.
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hFile;
DWORD dwBytesToWrite = (DWORD)strlen("Hello, World!");
DWORD dwBytesWritten = 0;
BOOL bErrorFlag = FALSE;
hFile = CreateFile("example.txt", // nome do arquivo
GENERIC_WRITE, // acesso de escrita
0, // sem compartilhamento
NULL, // atributo de segurança padrão
CREATE_NEW, // cria novo arquivo
FILE_ATTRIBUTE_NORMAL, // atributos normais
NULL); // sem template
if (hFile == INVALID_HANDLE_VALUE) {
printf("CreateFile falhou (%d)\n", GetLastError());
return -1;
}
bErrorFlag = WriteFile(
hFile, // handle do arquivo
"Hello, World!", // dados a serem escritos
dwBytesToWrite, // número de bytes a serem escritos
&dwBytesWritten, // número de bytes escritos
NULL); // sem estrutura OVERLAPPED
if (FALSE == bErrorFlag) {
printf("WriteFile falhou (%d)\n", GetLastError());
} else {
if (dwBytesWritten != dwBytesToWrite) {
printf("WriteFile falhou: número de bytes escritos diferente do esperado.\n");
} else {
printf("Escrita bem-sucedida.\n");
}
}
CloseHandle(hFile);
return 0;
}