Membaca kode error Windows — struktur tiga lapis Win32, HRESULT, dan NTSTATUS

· Diperbarui pada: · · Windows, Kode error, HRESULT, NTSTATUS, Win32 API, Pemecahan masalah, Debugging, Pengembangan Windows

Riwayat revisi (5 pembaruan, terakhir pada 31 Aug 2026)

Catatan perubahan yang dilakukan pada artikel ini. Jika versi sebelumnya telah diarsipkan, versi itu tetap dapat dibaca melalui tautan permanen dengan DOI.

Diterjemahkan ulang sebagai terjemahan lengkap dari naskah Jepang. Versi bahasa Indonesia sebelumnya adalah ringkasan yang hanya memindahkan sebagian naskah, sehingga bagian, tabel, gambar Mermaid, keterangan gambar, dan FAQ tidak ada. Semuanya dipulihkan sesuai naskah Jepang, dan klaim teknisnya sama dengan versi Jepang.
Relasi peta pengetahuan ditinjau ulang dan relasi yang tidak selaras dengan teks penjelasan (arah terbalik, generalisasi berlebihan, predikat yang tertukar) diperbaiki. Penjelasan dalam teks tidak diubah.
Relasi peta pengetahuan ditinjau ulang dan relasi yang tidak selaras dengan teks penjelasan (arah terbalik, generalisasi berlebihan, predikat yang tertukar) diperbaiki. Penjelasan dalam teks tidak diubah.
Relasi peta pengetahuan «RtlNtStatusToDosError mengimplementasikan NTSTATUS» diubah menjadi «mengimplementasikan konversi dari NTSTATUS ke kode error Win32». Penjelasan dalam teks tidak diubah.
Agar penjelasan mekanisme dapat diikuti lewat diagram, ditambahkan 21 diagram Mermaid. Diagram mencakup alur konversi lintas tiga sistem, pembacaan ulang notasi, cara membaca GetLastError, pengambilan pesan dengan FormatMessage dan pencatatan log, perbedaan error 998 dan 5, percabangan penyebab error 5, hubungan bit S HRESULT dan bilangan negatif, perbedaan penguraian 0x80004005 dan 0x80070005, perilaku HRESULT_FROM_WIN32, perbedaan cara menelusuri 0x8007 dan 0x8004, penentuan jenis NTSTATUS dan jembatannya, pembedaan exception code dan STOP code, pelengkap IErrorInfo, pemetaan ke exception .NET, pengambilan error pada P/Invoke, cara menelusuri dengan err.exe, perintah standar, dan WinDbg, percabangan prosedur investigasi kode error, serta perbedaan arah investigasi error 5 dan 0xC0000005. Kalimat teks, kode, dan tautan referensi tidak diubah.
Publikasi pertama
Mengutip artikel ini(DOI (arsip terdaftar): 10.5281/zenodo.22176043)

DOI di bawah mengarah ke versi yang telah diarsipkan sebelumnya dan mungkin berbeda dari teks saat ini. Gunakan URL halaman ini untuk merujuk teks saat ini.

Go Komura (2026). Membaca kode error Windows — struktur tiga lapis Win32, HRESULT, dan NTSTATUS. KomuraSoft LLC. https://comcomponent.com/id/blog/windows-error-codes-win32-hresult-ntstatus/

DOI (arsip terdaftar)
10.5281/zenodo.22176043
DOI (versi terakhir yang didaftarkan)
10.5281/zenodo.22176044

“Layar aplikasi menampilkan error 0x80004005. Apa artinya?” — Pertanyaan semacam ini sudah jadi klasik dalam konsultasi investigasi gangguan. Banyak orang menempelkan angka di dialog error langsung ke mesin pencari, lalu disambut banjir artikel yang tidak terkait — kegagalan Windows Update, folder bersama yang tidak tersambung, error runtime VBA, kegagalan koneksi basis data — dan justru semakin bingung.

Itu terjadi karena 0x80004005 (E_FAIL) adalah kode generik yang hanya berarti “kegagalan yang tidak ditentukan”. Kode yang sama dipakai di situasi yang tak terhitung, jadi mencari hanya berdasarkan kode tidak akan sampai ke penyebab. Sebaliknya, kode seperti 0x80070005, jika strukturnya diketahui, dapat diuraikan dalam beberapa detik sebelum mencari: “error Win32 nomor 5 = akses ditolak, dibungkus ulang sebagai HRESULT”.

Karena sejarahnya, kode error Windows membentuk tiga lapis — kode error Win32, HRESULT, dan NTSTATUS — dan saling dikonversi antarlapis. Setelah struktur itu dipahami, kita dapat menilai sendiri “lapis mana, pihak mana yang mengembalikan kode ini” dan “apa kode esensialnya”, sehingga langkah awal investigasi menjadi jauh lebih cepat.

Artikel ini ditujukan kepada staf IT usaha kecil dan menengah serta pengembang aplikasi Windows. Isinya menata cara membedakan dan menguraikan ketiga sistem kode error, hubungan dengan exception .NET, serta cara penelusuran praktis dengan err.exe dan PowerShell, berdasarkan Microsoft Learn dan spesifikasi publik [MS-ERREF] per Agustus 2026.

1. Kesimpulan dulu

  • Kode error Windows terutama terdiri dari tiga sistem. Kode error Win32 (bilangan desimal kecil yang dikembalikan GetLastError), HRESULT (kode 32-bit sejak era COM, heksadesimal yang dimulai 0x8 atau desimal negatif), dan NTSTATUS (kode lapis kernel; error dimulai 0xC).123
  • Desimal dan heksadesimal adalah notasi berbeda untuk kode yang sama. “Error 5”, “0x5”, dan “16 bit rendah dari 0x80070005” semuanya merujuk ERROR_ACCESS_DENIED (akses ditolak).1
  • 0x8007xxxx adalah “bungkus ulang error Win32”. Itu kode error Win32 yang disimpan di FACILITY_WIN32 (7) pada HRESULT. Ubah 16 bit rendah ke desimal, maka kode esensialnya terlihat. Ini pola paling penting dalam membaca kode error.45
  • 0x80004005 (E_FAIL) bukan kode penyebab. Artinya “Unspecified failure” dan tidak membawa informasi lebih. Alih-alih menggali kode ini, carilah konteks asal dan log yang menyertainya.6
  • Desimal negatif (-2147467259 dan sejenisnya) adalah HRESULT. Bit paling signifikan 32-bit (bit kegagalan) menyala, sehingga tampilan bertanda menjadi negatif. Ubah ke heksadesimal, baru dibaca.2
  • Nilai 8 digit yang dimulai 0xC adalah NTSTATUS. 0xC0000005 (pelanggaran akses) dan 0xC0000135 (DLL tidak ditemukan) sering muncul di event log dan dump saat crash. Keduanya tidak terkait dengan error Win32 nomor 5.7
  • Kode yang sama maknanya berubah menurut konteks. Penyebab error 5 mencakup ACL, elevasi hak, antivirus, file yang sedang dipegang, dan lain-lain. “File tidak ditemukan” pada error 2 pun sering kali DLL dependen. Makna kode dan API mana yang gagal terhadap apa harus dibaca sebagai satu paket.1
  • Alat konversi dan pencarian sudah tersedia secara standar. certutil -error dan net helpmsg built-in di Windows; Win32Exception di PowerShell mengambil pesan; di mesin pengembangan ada err.exe (Microsoft Error Lookup Tool); dalam analisis dump dipakai !error di WinDbg.8910
  • Di .NET, HRESULT dipetakan ke tipe exception. HRESULT yang dikenal menjadi tipe yang sesuai (E_ACCESSDENIED → UnauthorizedAccessException, dan sejenisnya); yang tidak dikenal menjadi COMException; nilai asli tetap di Exception.HResult.11

Dalam satu kalimat, pola investigasi kode error Windows adalah "selaraskan notasi ke heksadesimal → tentukan lapis mana kodenya → uraikan dan keluarkan kode esensial → baca bersama konteks".

Pada diagram, garis utuh menunjukkan relasi yang selalu berlaku dan garis putus-putus menunjukkan relasi bersyarat (syaratnya ada pada penjelasan masing-masing relasi di halaman rincian). Daftar lengkap relasi (total 18, beserta bukti dan tingkat kepastian) serta definisi konsep utama dikumpulkan di halaman rincian peta pengetahuan (dalam bahasa Jepang). Data: JSON-LD / Turtle

2. Windows punya tiga sistem kode error

Pertama, peta keseluruhan. Kode error Windows terbagi terutama menjadi tiga sistem berikut, menurut lapis yang mengembalikannya.

Sistem Pihak utama yang mengembalikan Tampilan khas Contoh representatif
Kode error Win32 API Win32 (GetLastError), kode keluar perintah Desimal kecil (0–15999) 5 = ERROR_ACCESS_DENIED
HRESULT Komponen COM, shell, installer, banyak kerangka kerja Heksadesimal 8 digit yang dimulai 0x8, atau desimal negatif 0x80004005 = E_FAIL
NTSTATUS Kernel, driver, API native (ntdll) Error adalah heksadesimal 8 digit yang dimulai 0xC 0xC0000005 = STATUS_ACCESS_VIOLATION

Secara historis ketiganya bertumpuk dalam urutan ini: kode error Win32 yang mewarisi nomor error MS-DOS, NTSTATUS yang dipakai kernel NT secara internal, lalu HRESULT yang dirancang saat pengenalan COM untuk “mengemas sukses/gagal dan sumber ke 32 bit”. Di Windows sekarang, alur konversi yang terjadi sehari-hari adalah: kernel mengembalikan NTSTATUS, subsistem Win32 mengonversinya menjadi kode error Win32, dan lapis COM membungkusnya lebih jauh sebagai HRESULT.124

Alur konversi lintas tiga sistemSubsistem Win32 mengonversi NTSTATUS yang dikembalikan kernel menjadi kode error Win32, lalu lapis COM membungkusnya lebih jauh sebagai HRESULTSubsistem Win32 mengonversiLapis COM membungkus ulangKernel dan driverNTSTATUS(error 0xC…)Kode error Win32(5 dan sejenisnya)HRESULT(0x8007xxxx)

Gambar 1: Alur konversi lintas lapis. NTSTATUS dari kernel menjadi error Win32, lalu dibungkus ulang sebagai HRESULT.

2.1. Biasakan membaca desimal dan heksadesimal secara bergantian

Sebelum membedakan ketiga sistem, variasi notasi perlu diserap. Kode yang sama ditampilkan sebagai desimal atau heksadesimal, tergantung situasinya.

  • “Error 5”, “kode error: 0x5” → ERROR_ACCESS_DENIED yang sama
  • “Error 1223”, “0x4C1” → ERROR_CANCELLED yang sama
  • “0x80070005”, “-2147024891” → HRESULT yang sama

Di PowerShell konversinya satu baris.

# desimal → heksadesimal
'0x{0:X8}' -f 1223          # 0x000004C1
'0x{0:X8}' -f -2147024891   # 0x80070005 (negatif = HRESULT ke heksadesimal)

# heksadesimal → desimal
0x4C1                        # 1223

Jika desimal negatif yang dimulai “-214…” muncul, secara refleks ubah ke heksadesimal. Itu saja sudah banyak mengurangi tersesat di pintu masuk investigasi.

Tiga tampilan kode yang samaError desimal 5, heksadesimal 0x5, dan 16 bit rendah 0x80070005 semuanya merujuk ERROR_ACCESS_DENIED yang samaNotasi desimal: error 5ERROR_ACCESS_DENIEDNotasi heksadesimal: 0x516 bit rendah 0x80070005Notasi berbeda, kode sama

Gambar 2: Desimal, heksadesimal, dan 16 bit rendah HRESULT hanyalah notasi berbeda untuk kode yang sama.

3. Kode error Win32 — GetLastError dan FORMAT_MESSAGE

3.1. Perilaku dasar GetLastError

Banyak API Win32 seperti CreateFile dan RegOpenKeyEx menandai kegagalan lewat nilai kembali (FALSE, NULL, INVALID_HANDLE_VALUE, dan sejenisnya), dan menyimpan kode error rinci di “last-error code” yang dipegang per thread. Pemanggil mengambilnya dengan GetLastError segera setelah mengonfirmasi kegagalan.13

Ada dua peringatan praktis.13

  1. Baca segera setelah gagal. Jika panggilan API lain (fungsi logging, misalnya) diselipkan di antaranya, panggilan itu dapat menimpa last-error code.
  2. Jangan andalkan nilai saat sukses. Beberapa API mengosongkan last-error code ke 0 saat sukses; beberapa tidak menyentuhnya. Aturannya: konfirmasi kegagalan dari nilai kembali, baru kemudian baca.
Baca GetLastError segera setelah gagalSetelah mengonfirmasi kegagalan dari nilai kembali, ambil last-error code dengan GetLastError segera, tanpa menyelipkan panggilan API lainWin32 APIAplikasiWin32 APIAplikasiMenyelipkan API lain di antaranya dapat menimpaPanggilan CreateFileNilai kembali gagalGetLastErrorKode 5

Gambar 3: Baca last-error code segera setelah gagal. Menyelipkan panggilan API lain di antaranya dapat menimpanya.

Untuk mendapatkan string pesan dari kode, pakai FormatMessage dengan flag FORMAT_MESSAGE_FROM_SYSTEM.1

#include <windows.h>
#include <stdio.h>

void PrintLastError(const wchar_t* apiName)
{
    DWORD code = GetLastError();   // panggil segera setelah gagal (jangan selipkan API lain)
    wchar_t message[512] = L"";
    FormatMessageW(
        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        nullptr, code, 0, message, 512, nullptr);
    wprintf(L"%s failed: %lu (0x%08lX) %s", apiName, code, code, message);
}

Di log aplikasi sendiri, sisakan desimal dan heksadesimal sekaligus, plus teks pesan, seperti di atas. Investigasi di kemudian hari menjadi lebih cepat.

Ambil pesan dari kode lalu sisakan di logTentukan flag FORMAT_MESSAGE_FROM_SYSTEM pada FormatMessage untuk mengambil string pesan kode error, lalu sisakan desimal, heksadesimal, dan teks pesan di logKode error(contoh: 5)Ambil string dengan FormatMessageTeks pesanCatat di logTulis desimal, heksadesimal, dan teks bersamaan

Gambar 4: Kode error diubah menjadi string pesan dengan FormatMessage. Di log, sisakan desimal, heksadesimal, dan teks pesan bersamaan.

3.2. Kode representatif yang sering muncul di lapangan

Kode error Win32 didefinisikan dalam rentang 0–15999, dan daftar lengkapnya ada di Microsoft Learn.1 Di antaranya, kode-kode berikut berulang kali muncul dalam investigasi gangguan.

Desimal Heksadesimal Simbol Arti
2 0x2 ERROR_FILE_NOT_FOUND File yang ditentukan tidak ditemukan
3 0x3 ERROR_PATH_NOT_FOUND Path yang ditentukan tidak ditemukan
5 0x5 ERROR_ACCESS_DENIED Akses ditolak
32 0x20 ERROR_SHARING_VIOLATION Tidak dapat diakses karena sedang dipakai proses lain
87 0x57 ERROR_INVALID_PARAMETER Parameter tidak benar
122 0x7A ERROR_INSUFFICIENT_BUFFER Buffer yang diberikan terlalu kecil
998 0x3E6 ERROR_NOACCESS Akses tidak valid ke lokasi memori
1223 0x4C1 ERROR_CANCELLED Operasi dibatalkan oleh pengguna

Di antaranya, 998 (ERROR_NOACCESS) bukan “akses ditolak”, melainkan representasi Win32 dari pelanggaran akses memori. Itu wujud NTSTATUS STATUS_ACCESS_VIOLATION setelah dikonversi ke lapis Win32 (dibahas nanti). Jangan dikacaukan dengan nomor 5. Selain itu, 1223 (ERROR_CANCELLED) muncul misalnya saat pengguna memilih “Tidak” pada dialog elevasi UAC; ini lebih menandai “dibatalkan” daripada error.

Error 998 dan 5 adalah hal yang berbeda998 adalah pelanggaran akses memori, yaitu pelanggaran akses NTSTATUS yang dikonversi ke lapis Win32; maknanya berbeda dari 5 yang menyatakan akses ditolakDikonversi ke lapis Win32NTSTATUS 0xC0000005Error 998(ERROR_NOACCESS)Maknanya pelanggaran akses memoriError 5(akses ditolak)Masalah hak. Bukan 998

Gambar 5: Error 998 adalah wujud pelanggaran akses NTSTATUS setelah dikonversi ke lapis Win32. Berbeda dari 5 (akses ditolak).

3.3. Kode yang sama, makna berubah menurut konteks

Lebih penting daripada menghafal tabel kode representatif adalah rasa bahwa kode error hanya memberi tahu “jenis kegagalan”.

  • Error 5 (akses ditolak): kandidat penyebabnya luas — ACL NTFS kurang, penulisan ke area terlindungi tanpa hak administrator, blokir perangkat lunak antivirus atau AppLocker, hak akun layanan tidak cukup, dan lain-lain.
  • Error 2 (file tidak ditemukan): tidak selalu file yang ditentukan pengguna. DLL dependen yang coba dimuat secara implisit oleh EXE, file pengaturan yang dilihat di lokasi lain karena pengalihan registri (32-bit/64-bit), path yang gagal diekspansi variabel lingkungan — “file mana” yang tidak ditemukan tidak terlihat dari kodenya.
  • Error 32 (pelanggaran berbagi): inti masalahnya “proses mana yang memegangnya”, tetapi kode tidak memberitahukannya.
Penyebab error 5 ditentukan konteksMeski sama-sama akses ditolak, kandidat penyebabnya banyak — ACL kurang, tanpa hak administrator, dan lain-lain — sehingga perlu diidentifikasi API mana yang gagal terhadap apaError 5(akses ditolak)ACL kurangTanpa hak administratorBlokir perangkat lunak keamananHak layanan kurangIdentifikasi sasaran yang gagal dengan Procmon

Gambar 6: Kode hanya memberi tahu “jenis kegagalan”. Kandidat penyebab error 5 banyak, sehingga sasaran harus diidentifikasi.

Alat untuk mengukur “API mana · terhadap nama objek mana · mengembalikan hasil apa” adalah Process Monitor. Cara memakainya dibahas secara rinci di “Panduan praktis Process Monitor (ProcMon)”. Mencari arti kode error dan mengidentifikasi sasaran yang gagal adalah dua roda yang harus berjalan bersama.

4. HRESULT — membaca struktur yang dikemas dalam 32 bit

4.1. Tata letak bit

HRESULT adalah format yang mengemas sukses/gagal, sumber, dan kode rinci ke satu nilai 32-bit. Spesifikasi publik [MS-ERREF] mendefinisikan tata letak berikut.2

Posisi bit Nama Arti
31 S Tingkat keparahan. 0 = sukses, 1 = gagal
30 R Dicadangkan (saat dipetakan dari NTSTATUS, bagian dari tingkat keparahan)
29 C Bit Customer. 1 berarti kode yang didefinisikan pihak selain Microsoft
28 N 1 berarti nilai NTSTATUS yang dipetakan ke ruang HRESULT
27 X Dicadangkan (0)
26–16 Facility Kode facility yang menunjukkan sumber (11 bit)
15–0 Code Kode rinci di dalam facility (16 bit)

Bit S paling atas bernilai 1, yaitu HRESULT yang notasi heksadesimalnya dimulai 0x8 atau lebih adalah kegagalan. Jika ditampilkan sebagai bilangan bulat 32-bit bertanda, nilainya menjadi negatif — itulah identitas “-214…” yang disebutkan sebelumnya.

Hubungan bit S dan tampilan negatifHRESULT gagal menyetel bit S paling atas ke 1, sehingga heksadesimal dimulai 0x8 atau lebih, dan sebagai bilangan bulat 32-bit bertanda menjadi negatifBit S = 1(gagal)Heksadesimal dimulai 0x8 atau lebihTampilan bertanda menjadi negatifJika negatif, ubah ke heksadesimal lalu baca

Gambar 7: HRESULT gagal menyetel bit S ke 1, sehingga dimulai 0x8 atau lebih, dan tampilan bertanda menjadi negatif.

Nilai Facility yang representatif adalah sebagai berikut.5

Facility Nilai Tampilan heksadesimal Arti
FACILITY_NULL 0 0x8000xxxx Kode yang dipakai luas (E_FAIL, E_UNEXPECTED, dan lain-lain)
FACILITY_RPC 1 0x8001xxxx Berasal dari RPC
FACILITY_ITF 4 0x8004xxxx Error definisi antarmuka (maknanya tergantung antarmuka)
FACILITY_WIN32 7 0x8007xxxx Bungkus ulang kode error Win32
FACILITY_WINDOWS 8 0x8008xxxx Antarmuka tambahan yang didefinisikan Microsoft

4.2. Menguraikan 0x80004005 dan 0x80070005

Mari diuraikan secara konkret.

Kasus 0x80004005: S = 1 (gagal), Facility = (0x80004005 » 16) & 0x7FF = 0 (FACILITY_NULL), Code = 0x4005. Ini kode generik FACILITY_NULL, didefinisikan sebagai E_FAIL “Unspecified failure” (kegagalan yang tidak ditentukan).6 Dengan kata lain, kode ini hanya berarti “kegagalan yang tidak dapat melaporkan rincian”. Jika 0x80004005 muncul, hentikan penggalian kode di situ, lalu alihkan fokus investigasi ke “komponen mana yang mengembalikannya” dan “apakah event log atau log aplikasi pada waktu yang sama memuat rincian”.

Kasus 0x80070005: S = 1, Facility = 7 (FACILITY_WIN32), Code = 0x0005 = 5. Terlihat bahwa ini error Win32 nomor 5 (ERROR_ACCESS_DENIED) yang dibungkus ulang sebagai HRESULT. Alias E_ACCESSDENIED pun, substansinya adalah nilai ini.6

Meski sama-sama “akses ditolak”, 0x80070005 adalah bungkus ulang kegagalan konkret yang terjadi di lapis Win32, dan jumlah informasinya sama sekali berbeda dari 0x80004005.

Penguraian 0x80004005 dan 0x800700050x80004005 adalah kode generik E_FAIL FACILITY_NULL tanpa rincian sehingga investigasi harus pindah ke konteks; 0x80070005 adalah FACILITY_WIN32, bungkus ulang akses ditolak error Win32 nomor 50x80004005Facility=0(FACILITY_NULL)Code=0x4005 → E_FAILKegagalan tidak ditentukan. Lanjut ke investigasi konteks0x80070005Facility=7(FACILITY_WIN32)Code=0x0005 → 5ERROR_ACCESS_DENIED

Gambar 8: Meski sama-sama “gagal”, penguraian mengubah jumlah informasi. 0x80070005 dapat ditelusuri sampai error Win32 nomor 5.

4.3. Pola terpenting: 0x8007xxxx = HRESULT_FROM_WIN32

Agar kegagalan lapis bawah yang hanya dapat mengembalikan kode error Win32 dapat disampaikan ke lapis atas yang mengembalikan HRESULT (metode COM atau runtime .NET), winerror.h menyediakan makro HRESULT_FROM_WIN32.4 Perilakunya: “simpan kode error Win32 di 16 bit rendah, setel Facility ke FACILITY_WIN32 (7), setel bit S ke 1”.

Perilaku HRESULT_FROM_WIN32Menyimpan kode error Win32 di 16 bit rendah, menyetel Facility ke 7 dan bit S ke 1, lalu merakit HRESULT 0x8007xxxxKode error Win32(contoh: 5)Simpan di 16 bit rendahSetel Facility ke 7Setel bit S ke 10x80070005

Gambar 9: HRESULT_FROM_WIN32 menyimpan error Win32 di 16 bit rendah, lalu menyalakan Facility = 7 dan bit S.

ERROR_ACCESS_DENIED (5)        --HRESULT_FROM_WIN32-->  0x80070005
ERROR_SHARING_VIOLATION (32)   --HRESULT_FROM_WIN32-->  0x80070020
ERROR_INVALID_PARAMETER (87)   --HRESULT_FROM_WIN32-->  0x80070057 (= E_INVALIDARG)
ERROR_OUTOFMEMORY (14)         --HRESULT_FROM_WIN32-->  0x8007000E (= E_OUTOFMEMORY)

Saat membaca arah sebaliknya, keluarkan 16 bit rendah dengan PowerShell.

0x80070005 -band 0xFFFF   # 5 → ERROR_ACCESS_DENIED
0x80072EE7 -band 0xFFFF   # 12007 → ERROR_INTERNET_NAME_NOT_RESOLVED (WinINet)

Seperti contoh kedua, error WinINet dan WinHTTP (rentang 12000-an) juga didefinisikan di ruang kode error Win32,1 sehingga 0x8007xxxx terkait jaringan dapat diuraikan dengan prosedur yang sama. Membiasakan diri pada “jika melihat 0x8007, ubah 4 digit rendah ke desimal” adalah keterampilan praktis utama yang ingin dibawa pulang dari artikel ini.

Catatan sebaliknya berlaku untuk 0x8004xxxx (FACILITY_ITF). Kode FACILITY_ITF didefinisikan maknanya per antarmuka, sehingga nilai 32-bit yang sama dapat berarti lain jika pihak yang mengembalikannya berbeda.5 Untuk 0x8004xxxx yang tidak familiar, jangan mengandalkan pencarian generik; telusuri di dokumentasi komponen yang mengembalikannya (pustaka, SDK driver, produk server).

Cara menelusuri 0x8007 dan 0x8004 berbeda0x8007xxxx FACILITY_WIN32 dapat dibaca dengan penguraian mekanis 16 bit rendah, sedangkan 0x8004xxxx FACILITY_ITF didefinisikan maknanya per antarmuka sehingga harus ditelusuri di bahan komponen yang mengembalikannya7, WIN324, ITFFacility-nya?Ubah 16 bit rendah ke desimalMakna berbeda menurut pihak yang mengembalikanBaca sebagai error Win32Telusuri di bahan pihak yang mengembalikan

Gambar 10: 0x8007xxxx dapat diuraikan secara mekanis, sedangkan 0x8004xxxx ditelusuri di bahan komponen yang mengembalikannya.

5. NTSTATUS — kode lapis kernel dan dunia crash

5.1. Tata letak dan Severity

NTSTATUS adalah kode 32-bit yang dipakai kernel, driver perangkat, dan API native ntdll. Tata letaknya mirip HRESULT, tetapi tidak sama.3

Posisi bit Nama Arti
31–30 Sev Tingkat keparahan. 00 = sukses, 01 = informasi, 10 = peringatan, 11 = error
29 C Bit Customer
28 N Dicadangkan (0, agar pemetaan ke HRESULT dimungkinkan)
27–16 Facility Facility (12 bit)
15–0 Code Kode rinci

Karena tingkat keparahan 2 bit, jenisnya dapat dibaca dari 1 digit heksadesimal terdepan. 0xC… adalah error (11), 0x8… peringatan (10), 0x4… informasi (01), 0x0–0x3… sukses. Contoh representatif “peringatan, bukan error” adalah exception breakpoint 0x80000003 (STATUS_BREAKPOINT).37

NTSTATUS dapat dibaca jenisnya dari 1 digit terdepanKarena tingkat keparahan 2 bit, NTSTATUS dibedakan dari 1 digit heksadesimal terdepan: 0xC error, 0x8 peringatan, 0x4 informasi, 0x0 sampai 0x3 sukses0xC0x80x40x0〜0x31 digit heksadesimal terdepan?ErrorPeringatanInformasiSuksesContoh: 0x80000003 adalah peringatan

Gambar 11: Jenis NTSTATUS dapat dibaca dari 1 digit heksadesimal terdepan. 0x80000003 adalah “peringatan, bukan error”.

5.2. Di mana bertemu — exception code, STOP code, event log

Staf IT dan pengembang terutama bertemu NTSTATUS di sekitar crash.

  • Exception code saat aplikasi crash: “Exception code: 0xc0000005” yang tercatat di event log “Application Error (Event ID 1000)” adalah NTSTATUS. Nilai representatifnya sebagai berikut.7
Nilai Simbol Arti
0xC0000005 STATUS_ACCESS_VIOLATION Pelanggaran akses (akses memori tidak sah)
0xC0000135 STATUS_DLL_NOT_FOUND DLL yang diperlukan tidak ditemukan, tidak dapat dimulai
0xC00000FD STATUS_STACK_OVERFLOW Stack overflow
0xC0000374 STATUS_HEAP_CORRUPTION Kerusakan heap
  • STOP code layar biru: Sepintas mirip, tetapi STOP code (bug check code) seperti 0x0000009F (DRIVER_POWER_STATE_FAILURE) adalah sistem penomoran sendiri yang terpisah dari NTSTATUS, dengan referensi khusus.14 Cukup ingat pembedaan ini: “jika 0xC0000005 maka NTSTATUS; jika STOP 0x9F maka bug check code — jangan menarik tabel NTSTATUS”.
  • Kolom Result Process Monitor: NAME NOT FOUND dan ACCESS DENIED di kolom Result Procmon adalah nama tampilan NTSTATUS yang dikembalikan kernel (STATUS_OBJECT_NAME_NOT_FOUND atau STATUS_ACCESS_DENIED). Ini juga tempat untuk merasakan korespondensi lapis: kegagalan I/O file diamati dalam kosakata NTSTATUS, lalu dikonversi menjadi error Win32 sebelum sampai ke aplikasi.
Membaca exception code dan STOP code secara terpisahException code di event log dibaca sebagai NTSTATUS; STOP code layar biru ditarik dari referensi khusus bug check code, sistem yang berbedaException codeSTOP codeKode muncul di mana?Baca sebagai NTSTATUSTarik dari tabel bug check codeContoh: 0xC0000005Contoh: 0x0000009F

Gambar 12: Exception code di event log adalah NTSTATUS; STOP code layar biru sistem lain. Jangan salah tabel yang ditarik.

Investigasi setelah exception code, yaitu pengambilan dan analisis crash dump, lihat “Pengantar pengumpulan crash dump Windows” dan “Membaca crash dump dengan WinDbg + SOS”.

5.3. Hubungan dengan HRESULT — bit N dan RtlNtStatusToDosError

Jembatan NTSTATUS ke dua lapis lainnya ada dua jalur.

  1. Pemetaan ke ruang HRESULT: Jika bit N HRESULT (0x10000000) dinyalakan, nilai NTSTATUS dapat dibawa utuh ke ruang HRESULT (makro HRESULT_FROM_NT di winerror.h). 0xC0000005 yang dipetakan menjadi 0xD0000005, misalnya. Jika HRESULT yang dimulai 0xD muncul, matikan bit N lalu baca sebagai NTSTATUS — itu prosedur yang benar.2
  2. Konversi ke kode error Win32: RtlNtStatusToDosError di ntdll mengonversi NTSTATUS ke kode error Win32 yang sesuai. Nilai yang tidak punya korespondensi menjadi ERROR_MR_MID_NOT_FOUND.12 Misalnya STATUS_ACCESS_VIOLATION (0xC0000005) menjadi ERROR_NOACCESS (998), dan STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034) menjadi ERROR_FILE_NOT_FOUND (2). Berguna juga diingat bahwa kosakata kaya kernel kadang dibulatkan menjadi kategori kasar di lapis Win32.
Dua jembatan NTSTATUS ke lapis lainNTSTATUS sampai ke lapis lain lewat dua jalur: dipetakan ke ruang HRESULT dengan menyalakan bit N, atau dikonversi ke kode error Win32 dengan RtlNtStatusToDosErrorNyalakan bit NRtlNtStatusToDosErrorNTSTATUS(0xC0000005)HRESULT(0xD0000005)Error Win32 998(ERROR_NOACCESS)Jika korespondensi tidak didefinisikan: ERROR_MR_MID_NOT_FOUND

Gambar 13: Jembatan NTSTATUS ada dua jalur. Yang dimulai 0xD dibaca sebagai NTSTATUS setelah bit N dimatikan.

6. COM dan .NET — bagaimana kode error dipetakan ke exception

6.1. Cara COM — HRESULT + IErrorInfo

Metode COM pada dasarnya mengembalikan HRESULT, tetapi informasi yang muat di 32 bit terbatas, sehingga sebagai pelengkap mekanisme IErrorInfo dapat menyampaikan string penjelasan error dan sumber secara terpisah. Di C++, kelas dukungan kompiler _com_error menangani HRESULT dan IErrorInfo bersama. Aplikasi yang menampilkan “kode + teks penjelasan” di dialog error sering mengangkut teks itu lewat mekanisme ini.

IErrorInfo yang melengkapi HRESULTInformasi yang muat di HRESULT 32-bit terbatas, sehingga string penjelasan error dan sumber disampaikan terpisah lewat IErrorInfo; di C++ kelas _com_error menangani keduanya bersamaHRESULT(hanya 32 bit)Informasi yang muat terbatasIErrorInfo mengangkut teks penjelasan_com_error menanganinya bersamaKode + teks penjelasan di dialog

Gambar 14: String penjelasan yang tidak muat di HRESULT 32-bit diangkut terpisah oleh IErrorInfo.

6.2. Cara .NET — dari HRESULT ke tipe exception

Runtime .NET, saat menerima kegagalan HRESULT lewat interop COM, mengonversinya menjadi exception. HRESULT yang dikenal dipetakan ke tipe exception yang sesuai; yang tidak dikenal menjadi COMException.11

Pemetaan HRESULT ke exception .NETHRESULT gagal yang diterima lewat interop COM dikonversi ke tipe exception yang sesuai jika dikenal, atau ke COMException jika tidak; di keduanya nilai asli disimpan di Exception.HResultYaTidakHRESULT gagalAda pemetaan yang dikenal?Konversi ke tipe exception yang sesuaiKonversi ke COMExceptionNilai asli disimpan di Exception.HResult

Gambar 15: .NET memetakan HRESULT ke tipe exception, dan di exception mana pun nilai asli tetap di Exception.HResult.

HRESULT Tipe exception .NET
E_ACCESSDENIED (0x80070005) UnauthorizedAccessException
E_OUTOFMEMORY (0x8007000E) OutOfMemoryException
E_INVALIDARG (0x80070057) ArgumentException
E_NOTIMPL (0x80004001) NotImplementedException
Nilai tanpa pemetaan COMException (nilai asli di properti ErrorCode)

Pada exception mana pun, HRESULT asli disimpan di properti Exception.HResult. Percabangan seperti “hanya retry saat pelanggaran berbagi” dalam penanganan exception I/O file dapat ditulis dengan nilai ini.

try
{
    using var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None);
}
catch (IOException ex) when (ex.HResult == unchecked((int)0x80070020))
{
    // 0x80070020 = HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION)
    // proses lain sedang memegang file — tunggu sebentar lalu retry, dan sejenisnya
}

6.3. P/Invoke dan GetLastError

Jika API Win32 dipanggil langsung lewat P/Invoke, tetapkan SetLastError = true pada DllImport (atau LibraryImport), lalu ambil dengan Marshal.GetLastWin32Error (di .NET 6 ke atas, GetLastPInvokeError yang setara). Mendefinisikan P/Invoke GetLastError sendiri lalu memanggilnya tidak akurat, karena panggilan API internal runtime dapat menimpa nilainya.15

Mengambil last-error pada P/InvokeYang benar adalah SetLastError true lalu mengambil dengan Marshal.GetLastWin32Error; P/Invoke GetLastError secara langsung menjadi tidak akurat karena ditimpa runtimeMemanggil API Win32 lewat P/InvokeTetapkan SetLastError=trueAmbil dengan GetLastWin32ErrorDefinisi yang memanggil GetLastError langsungRuntime menimpa, tidak akurat

Gambar 16: Pada P/Invoke, pakai SetLastError=true dan Marshal.GetLastWin32Error sebagai satu paket. Pemanggilan GetLastError secara langsung tidak akurat.

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern SafeFileHandle CreateFileW(string fileName, uint access, uint share,
    IntPtr security, uint disposition, uint flags, IntPtr template);

// Terima nilai kembali sebagai SafeFileHandle, bukan IntPtr, lalu tutup pasti dengan using
// (jika dibiarkan sebagai IntPtr, handle kernel bocor)
using var handle = CreateFileW(@"C:\ProgramData\MyApp\config.dat",
    0x80000000 /*GENERIC_READ*/, 0, IntPtr.Zero, 3 /*OPEN_EXISTING*/, 0, IntPtr.Zero);
if (handle.IsInvalid)
{
    int code = Marshal.GetLastWin32Error();              // contoh: 5
    var message = new Win32Exception(code).Message;       // contoh: Akses ditolak.
    logger.LogError("CreateFileW failed: {Code} (0x{Code:X8}) {Message}",
        code, code, message);
}

Win32Exception mengambil string pesan OS dari kode error Win32, sehingga langsung dipakai untuk menyisakan kode dan pesan di log. Desain di lapis mana exception harus di-catch dan bagaimana dicatat di log dibahas di “Di mana catch dan log harus diletakkan dalam penanganan exception”.

7. Praktik alat konversi dan investigasi — rujukan cepat siap tempel

7.1. err.exe (Microsoft Error Lookup Tool)

Alat pencarian error berupa file eksekusi mandiri yang didistribusikan Microsoft. Alat ini menelusuri banyak file header seperti winerror.h dan ntstatus.h, lalu merinci definisi dan pesan yang cocok dengan kode yang ditentukan.8

err 0x80070005
err 5
err 0xC0000005

Satu angka dapat mengenai beberapa header (misalnya “5” cocok dengan definisi di berbagai tempat selain ERROR_ACCESS_DENIED Win32), sehingga kandidat mana yang layak harus dipilih dari konteks. Nama file unduhan berversi (pada saat penulisan, Err_6.4.5.exe), dan definisi kode mengikuti header pada saat bundel — perhatikan itu juga.8

Hasil pencarian err.exe dipilih dari kontekserr.exe merinci definisi yang cocok dengan menelusuri banyak file header, sehingga jika satu angka menghasilkan beberapa kandidat, yang layak dipilih dari konteksMasukkan err 5Pencarian lintas banyak headerBeberapa definisi mengenaiPilih kandidat yang layak dari konteks

Gambar 17: Karena err.exe menelusuri lintas header, kandidat bisa lebih dari satu; yang layak dipilih dari konteks.

7.2. Perintah standar Windows

Yang dapat dipakai tanpa instalasi tambahan adalah certutil dan net helpmsg. Opsi -error certutil menampilkan teks pesan yang sesuai dengan kode error, dan menerima HRESULT heksadesimal maupun desimal.9

certutil -error 0x80070005
certutil -error 5
net helpmsg 5

net helpmsg khusus untuk desimal kode error Win32, tetapi pada lingkungan bahasa Jepang pesan dikembalikan dalam bahasa Jepang, sehingga dapat dipakai langsung untuk penjelasan kepada pengguna.

Pembagian peran perintah standarKode error Win32 desimal ditelusuri dengan net helpmsg; kode yang mencakup HRESULT heksadesimal ditelusuri dengan opsi -error certutilWin32 desimalTermasuk heksadesimalKode di tangan?net helpmsgcertutil -errorPesan dalam bahasa sistem dikembalikanMenerima heksadesimal maupun desimal

Gambar 18: Pembagian peran perintah standar. Error Win32 desimal: net helpmsg; jika mencakup heksadesimal: certutil -error.

7.3. Kumpulan one-liner PowerShell

# kode error Win32 → string pesan OS
[System.ComponentModel.Win32Exception]::new(5).Message
# → Akses ditolak.

# desimal negatif → notasi heksadesimal (konfirmasi identitas HRESULT)
'0x{0:X8}' -f -2147467259     # 0x80004005

# 0x8007xxxx → kode error Win32 16 bit rendah
0x80070005 -band 0xFFFF        # 5

# HRESULT → konfirmasi exception yang dipetakan .NET
[System.Runtime.InteropServices.Marshal]::GetExceptionForHR(-2147024891)
# → UnauthorizedAccessException (0x80070005)

# kode error Win32 → HRESULT (reproduksi bungkus ulang)
'0x{0:X8}' -f (0x80070000 -bor 32)   # 0x80070020

7.4. !error di WinDbg

Untuk menelusuri kode saat analisis dump, ekstensi !error WinDbg cepat. Secara default ditafsirkan sebagai kode error Win32; tambahkan 1 sebagai argumen kedua untuk menafsirkannya sebagai NTSTATUS.10

0:000> !error 5
Error code: (Win32) 0x5 (5) - アクセスが拒否されました。

0:000> !error 0xc0000005 1
Error code: (NTSTATUS) 0xc0000005 - <アクセス違反>

Pada crash dump, !analyze -v menampilkan exception code (NTSTATUS) secara otomatis, lalu dari situ makna dikonfirmasi dengan !error <code> 1.

Alur konfirmasi exception code di WinDbgPada crash dump, perintah analyze menampilkan exception code secara otomatis, lalu kode itu diteruskan ke ekstensi error dengan argumen kedua 1 untuk mengonfirmasi makna sebagai NTSTATUSBuka crash dumpJalankan !analyze -vException code ditampilkanKonfirmasi makna dengan !error kode 1

Gambar 19: Dalam analisis dump, exception code yang ditampilkan !analyze -v ditelusuri dengan !error plus flag 1.

8. Prosedur investigasi — dari penentuan lapis sampai pencocokan dengan konteks

Pengetahuan sejauh ini disusun menjadi prosedur investigasi kode error yang aktual.

  1. Rapikan notasi. Jika desimal negatif, konversi ke 8 digit heksadesimal. Heksadesimal kurang dari 8 digit dibaca dengan zero-fill.
  2. Tentukan lapis mana kodenya. Seperti tabel penentuan di bawah, beberapa digit terdepan hampir selalu cukup.
  3. Uraikan dan keluarkan kode esensial. Jika 0x8007xxxx, 16 bit rendah; jika 0xDxxxxxxx, matikan bit N — operasi mekanis.
  4. Tarik nama dan definisi dengan alat. Konfirmasi nama simbol dan pesan dengan salah satu dari err.exe, certutil, atau !error.
  5. Cocokkan dengan konteks. Identifikasi aplikasi mana · operasi mana · API mana · gagal terhadap apa, lewat log aplikasi, event log, dan Procmon. Kode adalah “jenis kegagalan”; konteks adalah “lokasi penyebab”.
Prosedur investigasi kode errorPola investigasi: rapikan notasi ke heksadesimal, tentukan lapis dari beberapa digit terdepan, uraikan dan keluarkan kode esensial, tarik nama dan definisi dengan alat, lalu cocokkan dengan konteksNotasi desimal0x80070xC0xDRapikan notasi(negatif ke 8 digit heksadesimal)Beberapa digit terdepan?Baca sebagai error Win32Ubah 16 bit rendah ke desimalBaca sebagai NTSTATUSMatikan bit N lalu bacaTarik nama dan definisi dengan alatCocokkan dengan konteks(Procmon dll.)

Gambar 20: Pola investigasi. Rapikan notasi, tentukan lapis lalu uraikan, tarik nama, kemudian cocokkan dengan konteks.

Tampilan Kandidat pertama Cara menguraikan / mengonversi
Desimal 1–5 digit (5, 1223, dll.) Kode error Win32 Langsung ke net helpmsg atau err.exe
Desimal negatif (-2147024891, dll.) HRESULT Ubah ke 8 digit heksadesimal, lalu penentuan baris di bawah
0x8007xxxx HRESULT (FACILITY_WIN32) Ubah 16 bit rendah ke desimal, baca sebagai Win32
0x8004xxxx HRESULT (FACILITY_ITF) Telusuri di dokumentasi komponen yang mengembalikannya
0x8000xxxx HRESULT (FACILITY_NULL) Kode generik seperti E_FAIL. Pindahkan poros ke investigasi konteks
0xCxxxxxxx NTSTATUS (error) !error <code> 1; jika perlu, konversi ke Win32 lalu baca
0xDxxxxxxx Pemetaan HRESULT dari NTSTATUS Matikan bit N (0x10000000), baca sebagai NTSTATUS
Facility khusus seperti 0x8024xxxx HRESULT khusus domain fungsi Identifikasi domain dari nilai Facility, lalu ke bahan khusus (0x8024… adalah Windows Update)2

Yang terutama efektif pada langkah 5 “pencocokan dengan konteks” adalah kolom Result Process Monitor. Meski aplikasi hanya menampilkan “0x80070002”, Procmon menunjukkan dalam satu baris “proses mana · path mana · NAME NOT FOUND yang dikembalikan”. Cara menelusuri sisi event log juga ada di “Pengantar Windows Event Log dan ETW”.

9. Salah baca yang sering — pola yang memutar jauh investigasi

Terakhir, pola salah baca yang muncul dalam konsultasi aktual.

Salah baca 1: Menganggap 0x80004005 “kode yang menunjukkan penyebab tertentu”

E_FAIL adalah “kegagalan yang tidak ditentukan”; nilai yang sama muncul di Windows Update, jaringan, maupun basis data. Mencoba perbaikan yang muncul dari pencarian kode ini secara acak hampir pasti memutar jauh. Jangan dari kode, melainkan persempit dari “aplikasi mana · operasi mana · log lain pada waktu yang sama”.6

Salah baca 2: Tidak menyadari desimal negatif adalah HRESULT

Kasus log “Terjadi error -2147467259” dicari apa adanya, atau dikacaukan sebagai “error minus?”. Jika negatif, ubah ke heksadesimal. Itu saja sudah terlihat 0x80004005 (E_FAIL), dan tersambung ke pengetahuan salah baca 1.

Salah baca 3: Menelusuri 0x8007xxxx sebagai 8 digit utuh, tanpa melihat error Win32 di bagian rendah

Esensi 0x80070005 adalah “5 = akses ditolak”. Lebih cepat sampai ke inti jika 16 bit rendah dikeluarkan, lalu dipikirkan “apa arti error Win32 5 dalam konteks operasi ini”, daripada mencari 8 digit secara keseluruhan.

Salah baca 4: Mengira “kode sama = penyebab sama”

Jika pernah “error 5 disebabkan perangkat lunak antivirus”, error 5 berikutnya mudah diloncat ke penanganan yang sama. Meski kodenya sama, jika API yang gagal dan sumber daya sasaran berbeda, penyebabnya lain. Konfirmasi arti kode dan identifikasi sasaran dengan Procmon atau sejenisnya harus dilakukan sebagai satu paket setiap kali.

Salah baca 5: Mengacaukan error Win32 5 dengan 0xC0000005, STOP code dengan NTSTATUS

Jika ERROR_ACCESS_DENIED dan STATUS_ACCESS_VIOLATION disamakan karena sama-sama “5”, investigasi menyimpang ke arah yang sama sekali berbeda: masalah hak versus bug program. Selain itu, STOP code layar biru adalah sistem terpisah dari NTSTATUS, sehingga menarik 0x9F dari tabel NTSTATUS tidak menghasilkan jawaban yang bermakna.14

Arah investigasi error 5 dan 0xC0000005 berbedaError Win32 5 harus ditelusuri sebagai masalah hak, NTSTATUS 0xC0000005 sebagai bug program; menyamakannya membuat investigasi menyimpangError Win32 5Telusuri masalah hakNTSTATUS 0xC0000005Telusuri bug programKode tidak terkait dari sistem lain

Gambar 21: Jangan disamakan hanya karena “5”. Error 5 menuju masalah hak; 0xC0000005 menuju bug program.

10. Ringkasan

  • Kode error Windows adalah struktur tiga lapis: kode error Win32, HRESULT, dan NTSTATUS. Tentukan dulu lapis mana, pihak mana yang mengembalikan kodenya.
  • Variasi notasi (desimal/heksadesimal/negatif) dapat dirapikan secara mekanis. Negatif diubah ke 8 digit heksadesimal, baru dibaca.
  • HRESULT berstruktur bit S/R/C/N/X + Facility (11 bit) + Code (16 bit). 0x8007xxxx adalah pola terpenting: bungkus ulang error Win32. Ubah 16 bit rendah ke desimal untuk mengeluarkan kode esensial.
  • Kode generik seperti 0x80004005 (E_FAIL) tidak menunjukkan penyebab. Keputusan untuk berhenti menggali kode dan beralih ke investigasi konteks justru dimungkinkan karena strukturnya diketahui.
  • NTSTATUS dijumpai sebagai exception code crash atau kolom Result Procmon. 0xC0000005 adalah pelanggaran akses, tidak terkait error Win32 5. STOP code adalah sistem yang lagi-lagi berbeda.
  • Di .NET, HRESULT dipetakan ke tipe exception, dan nilai asli tetap di Exception.HResult. Pada P/Invoke, pakai SetLastError=true dan Marshal.GetLastWin32Error sebagai satu paket.
  • Alat penelusuran lengkap: certutil -error · net helpmsg (standar), err.exe (mesin pengembangan), one-liner PowerShell, !error WinDbg.
  • Prosedurnya: “rapikan notasi → tentukan lapis → uraikan → tarik nama → cocokkan dengan konteks”. Yang diajarkan kode hanya sampai jenis kegagalan; lokasi penyebab diajarkan konteks.

Saat bertemu kode error yang tidak familiar berikutnya, lihat beberapa digit terdepan sebelum menempelkannya ke kotak pencarian. Jika 0x8007, 4 digit rendah; jika 0xC, NTSTATUS; jika negatif, ubah ke heksadesimal — penguraian 10 detik ini sangat memengaruhi waktu investigasi setelahnya.

Artikel terkait

Area konsultasi terkait

Di Komura Soft LLC, kami menangani investigasi gangguan yang berangkat dari kode error — “arti kode error ini tidak jelas”, “0x80070005 hanya muncul di lingkungan tertentu” — desain penanganan error aplikasi yang mencampur Win32 API, COM, dan .NET, serta identifikasi penyebab dengan crash dump dan Process Monitor. Konsultasi dari satu tangkapan layar dialog error pun tidak apa-apa.

Tautan referensi

  1. Microsoft Learn, Debug system error codes. Indeks ke daftar kode error sistem Win32 (0–15999), pengambilan pesan kode yang dikembalikan GetLastError dengan FormatMessage berflag FORMAT_MESSAGE_FROM_SYSTEM, definisi error WinINet/WinHTTP (rentang 12000-an) di ruang ini, serta metode investigasi dengan Microsoft Error Lookup Tool dan perintah !err. ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  2. Microsoft Open Specifications, [MS-ERREF]: HRESULT. Tata letak bit HRESULT (bit S, R, C, N, X, Facility 11 bit, Code 16 bit), bit N menandai nilai NTSTATUS yang dipetakan ke ruang HRESULT, serta daftar kode facility termasuk FACILITY_WINDOWS_UPDATE (36). ↩ ↩2 ↩3 ↩4 ↩5

  3. Microsoft Open Specifications, [MS-ERREF]: NTSTATUS. Tata letak bit NTSTATUS (Sev 2 bit, bit C, bit N, Facility 12 bit, Code 16 bit), serta tingkat keparahan terbagi empat: sukses (00), informasi (01), peringatan (10), error (11). ↩ ↩2 ↩3

  4. Microsoft Learn, HRESULT_FROM_WIN32 macro. Definisi makro winerror.h yang memetakan kode error sistem Win32 ke nilai HRESULT. ↩ ↩2 ↩3

  5. Microsoft Learn, Structure of COM Error Codes. Peran bit tingkat keparahan dan field facility HRESULT, nilai FACILITY_NULL, FACILITY_RPC, FACILITY_ITF, FACILITY_WIN32, FACILITY_WINDOWS, serta bahwa kode FACILITY_ITF didefinisikan maknanya per antarmuka sehingga nilai yang sama dapat berarti lain. ↩ ↩2 ↩3

  6. Microsoft Learn, Common HRESULT values. E_FAIL (0x80004005) adalah “Unspecified failure” (kegagalan yang tidak ditentukan), serta definisi nilai HRESULT yang sering muncul seperti E_ACCESSDENIED (0x80070005), E_INVALIDARG (0x80070057), E_OUTOFMEMORY (0x8007000E). ↩ ↩2 ↩3 ↩4

  7. Microsoft Open Specifications, [MS-ERREF]: NTSTATUS values. Daftar nilai NTSTATUS termasuk STATUS_ACCESS_VIOLATION (0xC0000005), STATUS_DLL_NOT_FOUND (0xC0000135), STATUS_STACK_OVERFLOW (0xC00000FD), STATUS_HEAP_CORRUPTION (0xC0000374), STATUS_BREAKPOINT (0x80000003). ↩ ↩2 ↩3

  8. Microsoft Learn, The Microsoft Error Lookup Tool. Alat mandiri yang menampilkan teks pesan yang terkait dengan kode status heksadesimal lintas berbagai file header seperti Winerror.h; nama file unduhan Err_6.4.5.exe; perlu diperhatikan bahwa definisi yang tercakup adalah pada saat kompilasi. ↩ ↩2 ↩3

  9. Microsoft Learn, certutil. Opsi -error certutil menampilkan teks pesan yang terkait dengan kode error, serta notasi error yang mencakup nama simbol seperti 0x80070002 (WIN32: 2 ERROR_FILE_NOT_FOUND). ↩ ↩2

  10. Microsoft Learn, !error. Ekstensi !error WinDbg mendekode dan menampilkan nilai error Win32, Winsock, NTSTATUS, dan NetAPI; jika flag 1 ditentukan, ditafsirkan sebagai NTSTATUS. ↩ ↩2

  11. Microsoft Learn, How to: Map HRESULTs and exceptions. Mekanisme pemetaan timbal balik HRESULT COM dan exception .NET, tabel korespondensi seperti E_NOTIMPL → NotImplementedException, HRESULT tanpa pemetaan eksplisit dikonversi ke COMException, serta Message dan Source exception diinisialisasi dari informasi IErrorInfo. ↩ ↩2

  12. Microsoft Learn, RtlNtStatusToDosError function (winternl.h). Fungsi yang mengonversi kode NTSTATUS ke kode error sistem Win32 yang sesuai; jika korespondensi tidak didefinisikan, ERROR_MR_MID_NOT_FOUND dikembalikan; fungsi konversi sebaliknya tidak ada. ↩ ↩2

  13. Microsoft Learn, Last-Error Code. Last-error code dipegang per thread, harus diambil dengan GetLastError segera setelah gagal, API yang menimpa kode ke 0 saat sukses dan yang tidak bercampur, serta bit 29 dicadangkan untuk kode yang didefinisikan aplikasi. ↩ ↩2

  14. Microsoft Learn, Bug check code reference. Daftar bug check code (STOP code) yang ditampilkan di layar biru, serta cara menampilkan informasi kode dengan ekstensi !analyze WinDbg. Dari daftar itu dapat dikonfirmasi bahwa ini sistem penomoran sendiri, terpisah dari NTSTATUS. ↩ ↩2

  15. Microsoft Learn, Marshal.GetLastWin32Error Method. Cara mengambil last-error code dari panggilan P/Invoke yang menyetel flag SetLastError; P/Invoke GetLastError secara langsung tidak dapat diandalkan karena penimpaan oleh panggilan API internal runtime; sejak .NET 6, GetLastPInvokeError direkomendasikan. ↩

Artikel terbaru dengan tag yang sama untuk mendalami topik-topik terdekat.

Halaman-halaman ini menempatkan topik dalam konteks layanan dan keputusan yang lebih luas.

Artikel ini berkaitan langsung dengan layanan berikut.

Pertanyaan yang sering diajukan

Pertanyaan yang sering muncul dalam konsultasi tentang topik artikel ini.

Apa arti error 0x80004005?
0x80004005 adalah HRESULT E_FAIL, yang artinya "Unspecified failure" (kegagalan yang tidak ditentukan). Dengan kata lain, kode ini hanya menandai bahwa "terjadi kegagalan yang tidak dapat melaporkan alasan rinci"; bukan kode yang mewakili penyebab itu sendiri. Itulah sebabnya 0x80004005 yang sama bisa muncul di situasi yang tidak saling terkait — jaringan, Windows Update, VBA, driver basis data, dan lain-lain. Jika kode ini muncul, jangan menggali makna kodenya. Persempit penyebab dari konteks: aplikasi dan operasi mana yang menghasilkannya, plus informasi error lain di event log atau log rinci.
Apa kode error negatif seperti -2147467259?
Itu HRESULT 32-bit yang ditampilkan sebagai desimal bertanda. Saat gagal, bit paling signifikan HRESULT menjadi 1, sehingga tampilan sebagai bilangan bulat bertanda selalu negatif. Di PowerShell, '0x{0:X8}' -f -2147467259 mengembalikannya ke notasi heksadesimal (pada contoh ini 0x80004005 = E_FAIL). Jika di log atau pesan error skrip muncul angka negatif yang dimulai dengan -214…, langkah baku pertama adalah mengubahnya ke heksadesimal, baru kemudian menelusurinya.
Apa cara paling mudah untuk mencari arti kode error?
Tanpa instalasi tambahan, gunakan net helpmsg 5 di Command Prompt (untuk error Win32 dalam desimal) dan certutil -error 0x80070005. certutil juga menerima HRESULT heksadesimal, lalu menampilkan nama simbol dan teks pesan. Di PowerShell, [System.ComponentModel.Win32Exception]::new(5).Message mengambil pesan dalam bahasa sistem. Di mesin pengembangan, simpan alat pencarian resmi Microsoft err.exe (Microsoft Error Lookup Tool); alat ini menelusuri Win32, HRESULT, dan NTSTATUS sekaligus dan merinci definisi yang cocok.
Error seperti apa 0xC0000005?
Itu NTSTATUS STATUS_ACCESS_VIOLATION, yaitu pelanggaran akses (akses memori yang tidak sah). Kode ini paling sering muncul sebagai "Exception code" di event log atau crash dump saat aplikasi crash, dan menandai bug program seperti dereferensi pointer tidak valid atau akses ke memori yang sudah dibebaskan. Namanya mirip error Win32 5 (ERROR_ACCESS_DENIED = akses ditolak), tetapi itu kode yang tidak terkait dari sistem lain, jadi jangan dikacaukan. Cara andal untuk mengidentifikasi penyebab adalah mengambil crash dump lalu menganalisisnya di WinDbg.
Mengapa penyebabnya berbeda setiap kali, padahal kode errornya sama?
Karena kode error hanya menyatakan "jenis kegagalan"; "apa yang gagal dan mengapa" ditentukan oleh konteks pemanggilan. Error 5 (akses ditolak), misalnya, adalah kode yang sama untuk penyebab yang sama sekali berbeda: izin NTFS kurang, hak administrator tidak cukup, blokir perangkat lunak antivirus, dan seterusnya. Dalam situasi yang mirip, jika proses lain masih membuka file, kodenya berbeda (error 32 = pelanggaran berbagi), dan membaca kode dengan benar mengubah tempat yang perlu diperiksa. Error 2 (file tidak ditemukan) juga sering bukan file utama, melainkan DLL dependen atau file pengaturan. Setelah arti kodenya diketahui, memastikan API mana yang gagal terhadap sumber daya mana — misalnya dengan Process Monitor — adalah jalan pendek ke penyebab.

Profil penulis

Halaman perkenalan penulis artikel.

Go Komura

Direktur KomuraSoft LLC

Berspesialisasi dalam pengembangan perangkat lunak Windows, konsultasi teknis, dan investigasi bug, terutama pada proyek dengan sistem yang sudah ada dan bug yang sulit direproduksi.

Kembali ke blog