From 485a6bbfe79ee2b44637db2e718b51292a82e3b7 Mon Sep 17 00:00:00 2001 From: Maksymilian Wilczynski Date: Wed, 1 Jul 2026 23:19:11 +0200 Subject: [PATCH] introduce a stable NTL_DDK driver ABI to replace direct HAL_API and kernel-header access in drivers, add code/kernel/io_ddk.c and code/public/ntlite/ddk/ headers, change DriverEntry to take (const NTL_DDK*, NTL_DRIVER_INIT*), update kmain to build the DDK once via IoInitializeDdk/IoGetDdk and hand it to both boot and runtime drivers, downgrade code/public/ntlite/ddi/io_driver.h to a legacy I/O model header pulling from ntlite/ddk instead of kernel internals, move code/third_party/lwip into code/drivers/net/lwip/third_party, fix up lwip_sources.txt and build.c include paths to match, split build.c's single CFLAGS macro into COMMON/KERNEL/USER/BOOT/DRIVER cflags. --- OVMF/OVMF_VARS_4M_d.fd | Bin 540672 -> 540672 bytes code/build/build.c | 48 +-- code/drivers/bus/pci/pci.c | 59 ++-- code/drivers/bus/usb/usb.c | 9 +- code/drivers/bus/usb/usb.h | 30 +- code/drivers/bus/usb/usb_hub.c | 10 +- code/drivers/bus/usb/usb_storage.c | 4 +- code/drivers/bus/usb/usb_xhci.c | 34 +-- code/drivers/display/vmwaresvga/vmwaresvga.c | 9 +- code/drivers/display/vmwaresvga/vmwaresvga.h | 12 +- code/drivers/fs/fat32/fat32.c | 6 +- code/drivers/fs/fat32/fat32.h | 22 +- code/drivers/fs/ntfs/ntfs.c | 18 +- code/drivers/input/ps2/ps2.c | 5 +- code/drivers/input/ps2/ps2.h | 8 +- code/drivers/input/serial/serial.c | 13 +- code/drivers/net/lwip/README.md | 6 +- code/drivers/net/lwip/include/arch/cc.h | 2 +- code/drivers/net/lwip/lwip_sources.txt | 90 +++--- code/drivers/net/lwip/lwip_stack.c | 37 ++- code/drivers/net/lwip/lwip_sys_arch.c | 18 +- .../net/lwip}/third_party/lwip/COPYING | 0 .../net/lwip}/third_party/lwip/FILES | 0 .../net/lwip}/third_party/lwip/README | 0 .../net/lwip}/third_party/lwip/src/FILES | 0 .../third_party/lwip/src/Filelists.cmake | 0 .../lwip}/third_party/lwip/src/Filelists.mk | 0 .../lwip}/third_party/lwip/src/api/api_lib.c | 0 .../lwip}/third_party/lwip/src/api/api_msg.c | 0 .../net/lwip}/third_party/lwip/src/api/err.c | 0 .../lwip}/third_party/lwip/src/api/if_api.c | 0 .../lwip}/third_party/lwip/src/api/netbuf.c | 0 .../lwip}/third_party/lwip/src/api/netdb.c | 0 .../lwip}/third_party/lwip/src/api/netifapi.c | 0 .../lwip}/third_party/lwip/src/api/sockets.c | 0 .../lwip}/third_party/lwip/src/api/tcpip.c | 0 .../src/apps/altcp_tls/altcp_tls_mbedtls.c | 0 .../apps/altcp_tls/altcp_tls_mbedtls_mem.c | 0 .../apps/altcp_tls/altcp_tls_mbedtls_mem.h | 0 .../altcp_tls/altcp_tls_mbedtls_structs.h | 0 .../lwip/src/apps/http/altcp_proxyconnect.c | 0 .../lwip}/third_party/lwip/src/apps/http/fs.c | 0 .../lwip/src/apps/http/fs/404.html | 0 .../lwip/src/apps/http/fs/img/sics.gif | Bin .../lwip/src/apps/http/fs/index.html | 0 .../third_party/lwip/src/apps/http/fsdata.c | 0 .../third_party/lwip/src/apps/http/fsdata.h | 0 .../lwip/src/apps/http/http_client.c | 0 .../third_party/lwip/src/apps/http/httpd.c | 0 .../lwip/src/apps/http/httpd_structs.h | 0 .../lwip/src/apps/http/makefsdata/makefsdata | 0 .../src/apps/http/makefsdata/makefsdata.c | 0 .../lwip/src/apps/http/makefsdata/readme.txt | 0 .../lwip/src/apps/http/makefsdata/tinydir.h | 0 .../lwip/src/apps/lwiperf/lwiperf.c | 0 .../third_party/lwip/src/apps/mdns/mdns.c | 0 .../lwip/src/apps/mdns/mdns_domain.c | 0 .../third_party/lwip/src/apps/mdns/mdns_out.c | 0 .../third_party/lwip/src/apps/mqtt/mqtt.c | 0 .../lwip/src/apps/netbiosns/netbiosns.c | 0 .../third_party/lwip/src/apps/smtp/smtp.c | 0 .../lwip/src/apps/snmp/snmp_asn1.c | 0 .../lwip/src/apps/snmp/snmp_asn1.h | 0 .../lwip/src/apps/snmp/snmp_core.c | 0 .../lwip/src/apps/snmp/snmp_core_priv.h | 0 .../lwip/src/apps/snmp/snmp_mib2.c | 0 .../lwip/src/apps/snmp/snmp_mib2_icmp.c | 0 .../lwip/src/apps/snmp/snmp_mib2_interfaces.c | 0 .../lwip/src/apps/snmp/snmp_mib2_ip.c | 0 .../lwip/src/apps/snmp/snmp_mib2_snmp.c | 0 .../lwip/src/apps/snmp/snmp_mib2_system.c | 0 .../lwip/src/apps/snmp/snmp_mib2_tcp.c | 0 .../lwip/src/apps/snmp/snmp_mib2_udp.c | 0 .../third_party/lwip/src/apps/snmp/snmp_msg.c | 0 .../third_party/lwip/src/apps/snmp/snmp_msg.h | 0 .../lwip/src/apps/snmp/snmp_netconn.c | 0 .../lwip/src/apps/snmp/snmp_pbuf_stream.c | 0 .../lwip/src/apps/snmp/snmp_pbuf_stream.h | 0 .../third_party/lwip/src/apps/snmp/snmp_raw.c | 0 .../lwip/src/apps/snmp/snmp_scalar.c | 0 .../src/apps/snmp/snmp_snmpv2_framework.c | 0 .../lwip/src/apps/snmp/snmp_snmpv2_usm.c | 0 .../lwip/src/apps/snmp/snmp_table.c | 0 .../lwip/src/apps/snmp/snmp_threadsync.c | 0 .../lwip/src/apps/snmp/snmp_traps.c | 0 .../third_party/lwip/src/apps/snmp/snmpv3.c | 0 .../lwip/src/apps/snmp/snmpv3_mbedtls.c | 0 .../lwip/src/apps/snmp/snmpv3_priv.h | 0 .../third_party/lwip/src/apps/sntp/sntp.c | 0 .../third_party/lwip/src/apps/tftp/tftp.c | 0 .../lwip}/third_party/lwip/src/core/altcp.c | 0 .../third_party/lwip/src/core/altcp_alloc.c | 0 .../third_party/lwip/src/core/altcp_tcp.c | 0 .../net/lwip}/third_party/lwip/src/core/def.c | 0 .../net/lwip}/third_party/lwip/src/core/dns.c | 0 .../third_party/lwip/src/core/inet_chksum.c | 0 .../lwip}/third_party/lwip/src/core/init.c | 0 .../net/lwip}/third_party/lwip/src/core/ip.c | 0 .../third_party/lwip/src/core/ipv4/acd.c | 0 .../third_party/lwip/src/core/ipv4/autoip.c | 0 .../third_party/lwip/src/core/ipv4/dhcp.c | 0 .../third_party/lwip/src/core/ipv4/etharp.c | 0 .../third_party/lwip/src/core/ipv4/icmp.c | 0 .../third_party/lwip/src/core/ipv4/igmp.c | 0 .../third_party/lwip/src/core/ipv4/ip4.c | 0 .../third_party/lwip/src/core/ipv4/ip4_addr.c | 0 .../third_party/lwip/src/core/ipv4/ip4_frag.c | 0 .../third_party/lwip/src/core/ipv6/dhcp6.c | 0 .../third_party/lwip/src/core/ipv6/ethip6.c | 0 .../third_party/lwip/src/core/ipv6/icmp6.c | 0 .../third_party/lwip/src/core/ipv6/inet6.c | 0 .../third_party/lwip/src/core/ipv6/ip6.c | 0 .../third_party/lwip/src/core/ipv6/ip6_addr.c | 0 .../third_party/lwip/src/core/ipv6/ip6_frag.c | 0 .../third_party/lwip/src/core/ipv6/mld6.c | 0 .../third_party/lwip/src/core/ipv6/nd6.c | 0 .../net/lwip}/third_party/lwip/src/core/mem.c | 0 .../lwip}/third_party/lwip/src/core/memp.c | 0 .../lwip}/third_party/lwip/src/core/netif.c | 0 .../lwip}/third_party/lwip/src/core/pbuf.c | 0 .../net/lwip}/third_party/lwip/src/core/raw.c | 0 .../lwip}/third_party/lwip/src/core/stats.c | 0 .../net/lwip}/third_party/lwip/src/core/sys.c | 0 .../net/lwip}/third_party/lwip/src/core/tcp.c | 0 .../lwip}/third_party/lwip/src/core/tcp_in.c | 0 .../lwip}/third_party/lwip/src/core/tcp_out.c | 0 .../third_party/lwip/src/core/timeouts.c | 0 .../net/lwip}/third_party/lwip/src/core/udp.c | 0 .../lwip/src/include/compat/posix/arpa/inet.h | 0 .../lwip/src/include/compat/posix/net/if.h | 0 .../lwip/src/include/compat/posix/netdb.h | 0 .../src/include/compat/posix/sys/socket.h | 0 .../lwip/src/include/compat/stdc/errno.h | 0 .../third_party/lwip/src/include/lwip/acd.h | 0 .../third_party/lwip/src/include/lwip/altcp.h | 0 .../lwip/src/include/lwip/altcp_tcp.h | 0 .../lwip/src/include/lwip/altcp_tls.h | 0 .../third_party/lwip/src/include/lwip/api.h | 0 .../lwip/src/include/lwip/apps/FILES | 0 .../include/lwip/apps/altcp_proxyconnect.h | 0 .../lwip/apps/altcp_tls_mbedtls_opts.h | 0 .../lwip/src/include/lwip/apps/fs.h | 0 .../lwip/src/include/lwip/apps/http_client.h | 0 .../lwip/src/include/lwip/apps/httpd.h | 0 .../lwip/src/include/lwip/apps/httpd_opts.h | 0 .../lwip/src/include/lwip/apps/lwiperf.h | 0 .../lwip/src/include/lwip/apps/mdns.h | 0 .../lwip/src/include/lwip/apps/mdns_domain.h | 0 .../lwip/src/include/lwip/apps/mdns_opts.h | 0 .../lwip/src/include/lwip/apps/mdns_out.h | 0 .../lwip/src/include/lwip/apps/mdns_priv.h | 0 .../lwip/src/include/lwip/apps/mqtt.h | 0 .../lwip/src/include/lwip/apps/mqtt_opts.h | 0 .../lwip/src/include/lwip/apps/mqtt_priv.h | 0 .../lwip/src/include/lwip/apps/netbiosns.h | 0 .../src/include/lwip/apps/netbiosns_opts.h | 0 .../lwip/src/include/lwip/apps/smtp.h | 0 .../lwip/src/include/lwip/apps/smtp_opts.h | 0 .../lwip/src/include/lwip/apps/snmp.h | 0 .../lwip/src/include/lwip/apps/snmp_core.h | 0 .../lwip/src/include/lwip/apps/snmp_mib2.h | 0 .../lwip/src/include/lwip/apps/snmp_opts.h | 0 .../lwip/src/include/lwip/apps/snmp_scalar.h | 0 .../include/lwip/apps/snmp_snmpv2_framework.h | 0 .../src/include/lwip/apps/snmp_snmpv2_usm.h | 0 .../lwip/src/include/lwip/apps/snmp_table.h | 0 .../src/include/lwip/apps/snmp_threadsync.h | 0 .../lwip/src/include/lwip/apps/snmpv3.h | 0 .../lwip/src/include/lwip/apps/sntp.h | 0 .../lwip/src/include/lwip/apps/sntp_opts.h | 0 .../lwip/src/include/lwip/apps/tftp_client.h | 0 .../lwip/src/include/lwip/apps/tftp_common.h | 0 .../lwip/src/include/lwip/apps/tftp_opts.h | 0 .../lwip/src/include/lwip/apps/tftp_server.h | 0 .../third_party/lwip/src/include/lwip/arch.h | 0 .../lwip/src/include/lwip/autoip.h | 0 .../third_party/lwip/src/include/lwip/debug.h | 0 .../third_party/lwip/src/include/lwip/def.h | 0 .../third_party/lwip/src/include/lwip/dhcp.h | 0 .../third_party/lwip/src/include/lwip/dhcp6.h | 0 .../third_party/lwip/src/include/lwip/dns.h | 0 .../third_party/lwip/src/include/lwip/err.h | 0 .../third_party/lwip/src/include/lwip/errno.h | 0 .../lwip/src/include/lwip/etharp.h | 0 .../lwip/src/include/lwip/ethip6.h | 0 .../third_party/lwip/src/include/lwip/icmp.h | 0 .../third_party/lwip/src/include/lwip/icmp6.h | 0 .../lwip/src/include/lwip/if_api.h | 0 .../third_party/lwip/src/include/lwip/igmp.h | 0 .../third_party/lwip/src/include/lwip/inet.h | 0 .../lwip/src/include/lwip/inet_chksum.h | 0 .../third_party/lwip/src/include/lwip/init.h | 0 .../lwip/src/include/lwip/init.h.cmake.in | 0 .../third_party/lwip/src/include/lwip/ip.h | 0 .../third_party/lwip/src/include/lwip/ip4.h | 0 .../lwip/src/include/lwip/ip4_addr.h | 0 .../lwip/src/include/lwip/ip4_frag.h | 0 .../third_party/lwip/src/include/lwip/ip6.h | 0 .../lwip/src/include/lwip/ip6_addr.h | 0 .../lwip/src/include/lwip/ip6_frag.h | 0 .../lwip/src/include/lwip/ip6_zone.h | 0 .../lwip/src/include/lwip/ip_addr.h | 0 .../third_party/lwip/src/include/lwip/mem.h | 0 .../third_party/lwip/src/include/lwip/memp.h | 0 .../third_party/lwip/src/include/lwip/mld6.h | 0 .../third_party/lwip/src/include/lwip/nd6.h | 0 .../lwip/src/include/lwip/netbuf.h | 0 .../third_party/lwip/src/include/lwip/netdb.h | 0 .../third_party/lwip/src/include/lwip/netif.h | 0 .../lwip/src/include/lwip/netifapi.h | 0 .../third_party/lwip/src/include/lwip/opt.h | 0 .../third_party/lwip/src/include/lwip/pbuf.h | 0 .../lwip/src/include/lwip/priv/altcp_priv.h | 0 .../lwip/src/include/lwip/priv/api_msg.h | 0 .../lwip/src/include/lwip/priv/mem_priv.h | 0 .../lwip/src/include/lwip/priv/memp_priv.h | 0 .../lwip/src/include/lwip/priv/memp_std.h | 0 .../lwip/src/include/lwip/priv/nd6_priv.h | 0 .../lwip/src/include/lwip/priv/raw_priv.h | 0 .../lwip/src/include/lwip/priv/sockets_priv.h | 0 .../lwip/src/include/lwip/priv/tcp_priv.h | 0 .../lwip/src/include/lwip/priv/tcpip_priv.h | 0 .../lwip/src/include/lwip/prot/acd.h | 0 .../lwip/src/include/lwip/prot/autoip.h | 0 .../lwip/src/include/lwip/prot/dhcp.h | 0 .../lwip/src/include/lwip/prot/dhcp6.h | 0 .../lwip/src/include/lwip/prot/dns.h | 0 .../lwip/src/include/lwip/prot/etharp.h | 0 .../lwip/src/include/lwip/prot/ethernet.h | 0 .../lwip/src/include/lwip/prot/iana.h | 0 .../lwip/src/include/lwip/prot/icmp.h | 0 .../lwip/src/include/lwip/prot/icmp6.h | 0 .../lwip/src/include/lwip/prot/ieee.h | 0 .../lwip/src/include/lwip/prot/igmp.h | 0 .../lwip/src/include/lwip/prot/ip.h | 0 .../lwip/src/include/lwip/prot/ip4.h | 0 .../lwip/src/include/lwip/prot/ip6.h | 0 .../lwip/src/include/lwip/prot/mld6.h | 0 .../lwip/src/include/lwip/prot/nd6.h | 0 .../lwip/src/include/lwip/prot/tcp.h | 0 .../lwip/src/include/lwip/prot/udp.h | 0 .../third_party/lwip/src/include/lwip/raw.h | 0 .../third_party/lwip/src/include/lwip/sio.h | 0 .../third_party/lwip/src/include/lwip/snmp.h | 0 .../lwip/src/include/lwip/sockets.h | 0 .../third_party/lwip/src/include/lwip/stats.h | 0 .../third_party/lwip/src/include/lwip/sys.h | 0 .../third_party/lwip/src/include/lwip/tcp.h | 0 .../lwip/src/include/lwip/tcpbase.h | 0 .../third_party/lwip/src/include/lwip/tcpip.h | 0 .../lwip/src/include/lwip/timeouts.h | 0 .../third_party/lwip/src/include/lwip/udp.h | 0 .../lwip/src/include/netif/bridgeif.h | 0 .../lwip/src/include/netif/bridgeif_opts.h | 0 .../lwip/src/include/netif/etharp.h | 0 .../lwip/src/include/netif/ethernet.h | 0 .../lwip/src/include/netif/ieee802154.h | 0 .../lwip/src/include/netif/lowpan6.h | 0 .../lwip/src/include/netif/lowpan6_ble.h | 0 .../lwip/src/include/netif/lowpan6_common.h | 0 .../lwip/src/include/netif/lowpan6_opts.h | 0 .../lwip/src/include/netif/ppp/ccp.h | 0 .../lwip/src/include/netif/ppp/chap-md5.h | 0 .../lwip/src/include/netif/ppp/chap-new.h | 0 .../lwip/src/include/netif/ppp/chap_ms.h | 0 .../lwip/src/include/netif/ppp/eap.h | 0 .../lwip/src/include/netif/ppp/ecp.h | 0 .../lwip/src/include/netif/ppp/eui64.h | 0 .../lwip/src/include/netif/ppp/fsm.h | 0 .../lwip/src/include/netif/ppp/ipcp.h | 0 .../lwip/src/include/netif/ppp/ipv6cp.h | 0 .../lwip/src/include/netif/ppp/lcp.h | 0 .../lwip/src/include/netif/ppp/magic.h | 0 .../lwip/src/include/netif/ppp/mppe.h | 0 .../src/include/netif/ppp/polarssl/arc4.h | 0 .../lwip/src/include/netif/ppp/polarssl/des.h | 0 .../lwip/src/include/netif/ppp/polarssl/md4.h | 0 .../lwip/src/include/netif/ppp/polarssl/md5.h | 0 .../src/include/netif/ppp/polarssl/sha1.h | 0 .../lwip/src/include/netif/ppp/ppp.h | 0 .../lwip/src/include/netif/ppp/ppp_impl.h | 0 .../lwip/src/include/netif/ppp/ppp_opts.h | 0 .../lwip/src/include/netif/ppp/pppapi.h | 0 .../lwip/src/include/netif/ppp/pppcrypt.h | 0 .../lwip/src/include/netif/ppp/pppdebug.h | 0 .../lwip/src/include/netif/ppp/pppoe.h | 0 .../lwip/src/include/netif/ppp/pppol2tp.h | 0 .../lwip/src/include/netif/ppp/pppos.h | 0 .../lwip/src/include/netif/ppp/upap.h | 0 .../lwip/src/include/netif/ppp/vj.h | 0 .../lwip/src/include/netif/slipif.h | 0 .../lwip/src/include/netif/zepif.h | 0 .../lwip}/third_party/lwip/src/netif/FILES | 0 .../third_party/lwip/src/netif/bridgeif.c | 0 .../third_party/lwip/src/netif/bridgeif_fdb.c | 0 .../third_party/lwip/src/netif/ethernet.c | 0 .../third_party/lwip/src/netif/lowpan6.c | 0 .../third_party/lwip/src/netif/lowpan6_ble.c | 0 .../lwip/src/netif/lowpan6_common.c | 0 .../lwip/src/netif/ppp/PPPD_FOLLOWUP | 0 .../third_party/lwip/src/netif/ppp/auth.c | 0 .../third_party/lwip/src/netif/ppp/ccp.c | 0 .../third_party/lwip/src/netif/ppp/chap-md5.c | 0 .../third_party/lwip/src/netif/ppp/chap-new.c | 0 .../third_party/lwip/src/netif/ppp/chap_ms.c | 0 .../third_party/lwip/src/netif/ppp/demand.c | 0 .../third_party/lwip/src/netif/ppp/eap.c | 0 .../third_party/lwip/src/netif/ppp/ecp.c | 0 .../third_party/lwip/src/netif/ppp/eui64.c | 0 .../third_party/lwip/src/netif/ppp/fsm.c | 0 .../third_party/lwip/src/netif/ppp/ipcp.c | 0 .../third_party/lwip/src/netif/ppp/ipv6cp.c | 0 .../third_party/lwip/src/netif/ppp/lcp.c | 0 .../third_party/lwip/src/netif/ppp/magic.c | 0 .../third_party/lwip/src/netif/ppp/mppe.c | 0 .../lwip/src/netif/ppp/multilink.c | 0 .../lwip/src/netif/ppp/polarssl/README | 0 .../lwip/src/netif/ppp/polarssl/arc4.c | 0 .../lwip/src/netif/ppp/polarssl/des.c | 0 .../lwip/src/netif/ppp/polarssl/md4.c | 0 .../lwip/src/netif/ppp/polarssl/md5.c | 0 .../lwip/src/netif/ppp/polarssl/sha1.c | 0 .../third_party/lwip/src/netif/ppp/ppp.c | 0 .../third_party/lwip/src/netif/ppp/pppapi.c | 0 .../third_party/lwip/src/netif/ppp/pppcrypt.c | 0 .../third_party/lwip/src/netif/ppp/pppoe.c | 0 .../third_party/lwip/src/netif/ppp/pppol2tp.c | 0 .../third_party/lwip/src/netif/ppp/pppos.c | 0 .../third_party/lwip/src/netif/ppp/upap.c | 0 .../third_party/lwip/src/netif/ppp/utils.c | 0 .../lwip}/third_party/lwip/src/netif/ppp/vj.c | 0 .../lwip}/third_party/lwip/src/netif/slipif.c | 0 .../lwip}/third_party/lwip/src/netif/zepif.c | 0 code/drivers/net/rtl8139/rtl8139.c | 17 +- code/drivers/net/rtl8139/rtl8139.h | 16 +- code/drivers/net/rtl816x/rtl816x.c | 21 +- code/drivers/net/rtl816x/rtl816x.h | 16 +- code/drivers/storage/ahci/ahci.c | 14 +- code/drivers/storage/ahci/ahci.h | 21 +- code/drivers/storage/ahci/ahci_port.c | 2 +- code/drivers/storage/ata/ata.c | 9 +- code/drivers/storage/ata/ata.h | 17 +- code/kernel/include/kernel/io_async.h | 58 +--- code/kernel/include/kernel/io_ddk.h | 14 + code/kernel/include/kernel/io_file.h | 279 +++--------------- code/kernel/include/kernel/ke_debug.h | 12 +- code/kernel/include/kernel/ke_display.h | 49 +-- code/kernel/include/kernel/ke_dpc.h | 38 +-- code/kernel/include/kernel/ke_event.h | 25 +- code/kernel/include/kernel/ke_irp.h | 198 +------------ code/kernel/include/kernel/ke_irql.h | 36 +-- code/kernel/include/kernel/ke_list.h | 48 +-- code/kernel/include/kernel/ke_spinlock.h | 95 +----- code/kernel/include/kernel/ke_thread.h | 5 + code/kernel/include/kernel/mm_pfn.h | 6 + code/kernel/include/kernel/mm_phys.h | 9 + code/kernel/include/kernel/mm_pte.h | 7 + code/kernel/include/kernel/ob_object.h | 47 +-- code/kernel/io_ddk.c | 119 ++++++++ code/kernel/kmain.c | 12 +- code/public/ntlite/ddi/io_driver.h | 14 +- code/public/ntlite/ddk/async.h | 52 ++++ code/public/ntlite/ddk/ddk.h | 44 +++ code/public/ntlite/ddk/debug.h | 28 ++ code/public/ntlite/ddk/display.h | 62 ++++ code/public/ntlite/ddk/display_cursor.h | 35 +++ code/public/ntlite/ddk/dpc.h | 35 +++ code/public/ntlite/ddk/driver.h | 12 + code/public/ntlite/ddk/event.h | 45 +++ code/public/ntlite/ddk/file.h | 132 +++++++++ code/public/ntlite/ddk/interrupt.h | 17 ++ code/public/ntlite/ddk/irp.h | 226 ++++++++++++++ code/public/ntlite/ddk/irql.h | 35 +++ code/public/ntlite/ddk/list.h | 51 ++++ code/public/ntlite/ddk/memory.h | 186 ++++++++++++ code/public/ntlite/ddk/mutex.h | 28 ++ code/public/ntlite/ddk/object.h | 46 +++ code/public/ntlite/ddk/platform.h | 23 ++ code/public/ntlite/ddk/scheduler.h | 13 + code/public/ntlite/ddk/semaphore.h | 29 ++ code/public/ntlite/ddk/settings.h | 14 + code/public/ntlite/ddk/sync.h | 86 ++++++ code/public/ntlite/ddk/thread.h | 34 +++ code/public/ntlite/ddk/time.h | 13 + code/public/ntlite/ddk/timer.h | 11 + 385 files changed, 1822 insertions(+), 1079 deletions(-) rename code/{ => drivers/net/lwip}/third_party/lwip/COPYING (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/FILES (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/README (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/FILES (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/Filelists.cmake (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/Filelists.mk (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/api_lib.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/api_msg.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/err.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/if_api.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/netbuf.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/netdb.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/netifapi.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/sockets.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/api/tcpip.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/altcp_proxyconnect.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/fs.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/fs/404.html (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/fs/img/sics.gif (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/fs/index.html (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/fsdata.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/fsdata.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/http_client.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/httpd.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/httpd_structs.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/makefsdata/makefsdata (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/makefsdata/makefsdata.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/makefsdata/readme.txt (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/http/makefsdata/tinydir.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/lwiperf/lwiperf.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/mdns/mdns.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/mdns/mdns_domain.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/mdns/mdns_out.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/mqtt/mqtt.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/netbiosns/netbiosns.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/smtp/smtp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_asn1.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_asn1.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_core.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_core_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_icmp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_interfaces.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_ip.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_snmp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_system.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_tcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_mib2_udp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_msg.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_msg.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_netconn.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_raw.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_scalar.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_snmpv2_framework.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_snmpv2_usm.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_table.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_threadsync.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmp_traps.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmpv3.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmpv3_mbedtls.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/snmp/snmpv3_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/sntp/sntp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/apps/tftp/tftp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/altcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/altcp_alloc.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/altcp_tcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/def.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/dns.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/inet_chksum.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/init.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ip.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/acd.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/autoip.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/dhcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/etharp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/icmp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/igmp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/ip4.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/ip4_addr.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv4/ip4_frag.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/dhcp6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/ethip6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/icmp6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/inet6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/ip6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/ip6_addr.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/ip6_frag.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/mld6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/ipv6/nd6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/mem.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/memp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/netif.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/pbuf.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/raw.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/stats.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/sys.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/tcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/tcp_in.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/tcp_out.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/timeouts.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/core/udp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/compat/posix/arpa/inet.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/compat/posix/net/if.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/compat/posix/netdb.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/compat/posix/sys/socket.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/compat/stdc/errno.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/acd.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/altcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/altcp_tcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/altcp_tls.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/api.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/FILES (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/altcp_proxyconnect.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/fs.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/http_client.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/httpd.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/httpd_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/lwiperf.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mdns.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mdns_domain.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mdns_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mdns_out.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mdns_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mqtt.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mqtt_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/mqtt_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/netbiosns.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/netbiosns_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/smtp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/smtp_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_core.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_mib2.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_scalar.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_table.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmp_threadsync.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/snmpv3.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/sntp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/sntp_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/tftp_client.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/tftp_common.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/tftp_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/apps/tftp_server.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/arch.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/autoip.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/debug.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/def.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/dhcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/dhcp6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/dns.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/err.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/errno.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/etharp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ethip6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/icmp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/icmp6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/if_api.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/igmp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/inet.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/inet_chksum.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/init.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/init.h.cmake.in (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip4.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip4_addr.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip4_frag.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip6_addr.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip6_frag.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip6_zone.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/ip_addr.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/mem.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/memp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/mld6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/nd6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/netbuf.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/netdb.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/netif.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/netifapi.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/opt.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/pbuf.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/altcp_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/api_msg.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/mem_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/memp_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/memp_std.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/nd6_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/raw_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/sockets_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/tcp_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/priv/tcpip_priv.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/acd.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/autoip.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/dhcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/dhcp6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/dns.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/etharp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/ethernet.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/iana.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/icmp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/icmp6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/ieee.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/igmp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/ip.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/ip4.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/ip6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/mld6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/nd6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/tcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/prot/udp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/raw.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/sio.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/snmp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/sockets.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/stats.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/sys.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/tcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/tcpbase.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/tcpip.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/timeouts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/lwip/udp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/bridgeif.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/bridgeif_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/etharp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ethernet.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ieee802154.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/lowpan6.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/lowpan6_ble.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/lowpan6_common.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/lowpan6_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ccp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/chap-md5.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/chap-new.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/chap_ms.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/eap.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ecp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/eui64.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/fsm.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ipcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ipv6cp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/lcp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/magic.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/mppe.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/polarssl/arc4.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/polarssl/des.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/polarssl/md4.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/polarssl/md5.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/polarssl/sha1.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ppp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ppp_impl.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/ppp_opts.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/pppapi.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/pppcrypt.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/pppdebug.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/pppoe.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/pppol2tp.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/pppos.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/upap.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/ppp/vj.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/slipif.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/include/netif/zepif.h (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/FILES (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/bridgeif.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/bridgeif_fdb.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ethernet.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/lowpan6.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/lowpan6_ble.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/lowpan6_common.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/PPPD_FOLLOWUP (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/auth.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/ccp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/chap-md5.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/chap-new.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/chap_ms.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/demand.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/eap.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/ecp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/eui64.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/fsm.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/ipcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/ipv6cp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/lcp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/magic.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/mppe.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/multilink.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/polarssl/README (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/polarssl/arc4.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/polarssl/des.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/polarssl/md4.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/polarssl/md5.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/polarssl/sha1.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/ppp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/pppapi.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/pppcrypt.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/pppoe.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/pppol2tp.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/pppos.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/upap.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/utils.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/ppp/vj.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/slipif.c (100%) rename code/{ => drivers/net/lwip}/third_party/lwip/src/netif/zepif.c (100%) create mode 100644 code/kernel/include/kernel/io_ddk.h create mode 100644 code/kernel/io_ddk.c create mode 100644 code/public/ntlite/ddk/async.h create mode 100644 code/public/ntlite/ddk/ddk.h create mode 100644 code/public/ntlite/ddk/debug.h create mode 100644 code/public/ntlite/ddk/display.h create mode 100644 code/public/ntlite/ddk/display_cursor.h create mode 100644 code/public/ntlite/ddk/dpc.h create mode 100644 code/public/ntlite/ddk/driver.h create mode 100644 code/public/ntlite/ddk/event.h create mode 100644 code/public/ntlite/ddk/file.h create mode 100644 code/public/ntlite/ddk/interrupt.h create mode 100644 code/public/ntlite/ddk/irp.h create mode 100644 code/public/ntlite/ddk/irql.h create mode 100644 code/public/ntlite/ddk/list.h create mode 100644 code/public/ntlite/ddk/memory.h create mode 100644 code/public/ntlite/ddk/mutex.h create mode 100644 code/public/ntlite/ddk/object.h create mode 100644 code/public/ntlite/ddk/platform.h create mode 100644 code/public/ntlite/ddk/scheduler.h create mode 100644 code/public/ntlite/ddk/semaphore.h create mode 100644 code/public/ntlite/ddk/settings.h create mode 100644 code/public/ntlite/ddk/sync.h create mode 100644 code/public/ntlite/ddk/thread.h create mode 100644 code/public/ntlite/ddk/time.h create mode 100644 code/public/ntlite/ddk/timer.h diff --git a/OVMF/OVMF_VARS_4M_d.fd b/OVMF/OVMF_VARS_4M_d.fd index 8905bfc92637d5b7f7f319a4733b8a4e01213da5..6dafa812a3076be6c19bca579a7d449f23e135e5 100644 GIT binary patch delta 62 zcmZo@P;6*W+;H#5WH}?J%?dv+aZR?eP}|(`c?K(ET(jcOcEz8JK+LpV@h7uCTblq& Qn*eK@0Fc4HOn}1x07^p_QUCw| delta 55 zcmZo@P;6*W+;H#5^gK>Rr_BmKFLAXui7)~&)AlA2=DOe81*8}!2($^Xv #include -#include +#include #include -#include -#include -#include -#include -#include int _fltused; // MSVC floating-point helper anchor required by printf.obj -static const HAL_API* gHal; +static const NTL_DDK* gDdk; static DRIVER_OBJECT gPciDriver; static uint32_t gPciDeviceCount; @@ -38,7 +33,7 @@ static uint64_t PciAlignUp64(uint64_t value, uint64_t alignment) { // Implements the default Mmio Flags operation. static uint64_t PciDefaultMmioFlags(void) { - return PAGE_PRESENT | PAGE_WRITE | PAGE_WRITETHROUGH | PAGE_NOCACHE | PAGE_NX; + return NTL_DDK_PAGE_PRESENT | NTL_DDK_PAGE_WRITE | NTL_DDK_PAGE_WRITETHROUGH | NTL_DDK_PAGE_NOCACHE | NTL_DDK_PAGE_NX; } // Creates mmio Va. @@ -46,8 +41,8 @@ static KSTATUS PciAllocateMmioVa(uint64_t length, uintptr_t* outVa) { if (!outVa || !length) return NTLSTATUS_INVALID_PARAMETER; - uint64_t alignedLength = PciAlignUp64(length, PAGE_SIZE); - uintptr_t va = (uintptr_t)PciAlignUp64((uint64_t)gPciMmioNext, PAGE_SIZE); + uint64_t alignedLength = PciAlignUp64(length, NTL_DDK_PAGE_SIZE); + uintptr_t va = (uintptr_t)PciAlignUp64((uint64_t)gPciMmioNext, NTL_DDK_PAGE_SIZE); if (va < PCI_MMIO_VA_BASE || va >= PCI_MMIO_VA_LIMIT) return NTLSTATUS_NO_MEMORY; if (alignedLength > (uint64_t)(PCI_MMIO_VA_LIMIT - va)) @@ -70,14 +65,14 @@ static bool PciIsPdo(DEVICE_OBJECT* pdo, PCI_PDO_EXTENSION** outExt) { // Implements the raw Read32 operation. static uint32_t PciRawRead32(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset) { - if (!gHal || offset > 0xFCu) return 0xFFFFFFFFu; - return gHal->Pci.Read32(0, bus, dev, fn, offset & 0xFCu); + if (!gDdk || !gDdk->Platform || !gDdk->Platform->PciRead32 || offset > 0xFCu) return 0xFFFFFFFFu; + return gDdk->Platform->PciRead32(0, bus, dev, fn, offset & 0xFCu); } // Implements the raw Write32 operation. static void PciRawWrite32(uint8_t bus, uint8_t dev, uint8_t fn, uint16_t offset, uint32_t value) { - if (!gHal || offset > 0xFCu) return; - gHal->Pci.Write32(0, bus, dev, fn, offset & 0xFCu, value); + if (!gDdk || !gDdk->Platform || !gDdk->Platform->PciWrite32 || offset > 0xFCu) return; + gDdk->Platform->PciWrite32(0, bus, dev, fn, offset & 0xFCu, value); } // Implements the raw Read8 operation. @@ -391,7 +386,7 @@ static KSTATUS PciCreatePdo(uint8_t bus, uint8_t dev, uint8_t fn) { } gPciDeviceCount++; - DbgPrint("pci: %v ven=%04x dev=%04x class=%02x%02x%02x irq=%u\n", + gDdk->Debug->Print("pci: %v ven=%04x dev=%04x class=%02x%02x%02x irq=%u\n", pdo->Name, info.VendorId, info.DeviceId, @@ -416,7 +411,7 @@ static void PciEnumerateBus(void) { for (uint8_t fn = 0; fn < fnLimit; fn++) { KSTATUS st = PciCreatePdo((uint8_t)bus, (uint8_t)dev, fn); if (!KSUCCESS(st) && st != NTLSTATUS_NOT_FOUND) { - DbgPrint("pci: failed to create PDO for %02x:%02x.%u st=0x%x\n", + gDdk->Debug->Print("pci: failed to create PDO for %02x:%02x.%u st=0x%x\n", bus, dev, fn, st); } } @@ -529,19 +524,19 @@ __declspec(dllexport) KSTATUS PciMapBar(DEVICE_OBJECT* pdo, uint8_t index, uint6 return NTLSTATUS_INVALID_PARAMETER; uint64_t flags = pageFlags ? pageFlags : PciDefaultMmioFlags(); - flags |= PAGE_PRESENT; + flags |= NTL_DDK_PAGE_PRESENT; - uint64_t physBase = bar.Base & ~(uint64_t)(PAGE_SIZE - 1u); + uint64_t physBase = bar.Base & ~(uint64_t)(NTL_DDK_PAGE_SIZE - 1u); uint64_t physOffset = bar.Base - physBase; - uint64_t mapLength = PciAlignUp64(physOffset + bar.Length, PAGE_SIZE); + uint64_t mapLength = PciAlignUp64(physOffset + bar.Length, NTL_DDK_PAGE_SIZE); uintptr_t virtBase = 0; st = PciAllocateMmioVa(mapLength, &virtBase); if (!KSUCCESS(st)) return st; - for (uint64_t off = 0; off < mapLength; off += PAGE_SIZE) { - st = MmPteMapPage(virtBase + (uintptr_t)off, physBase + off, flags, MmPteMapFailIfPresent); + for (uint64_t off = 0; off < mapLength; off += NTL_DDK_PAGE_SIZE) { + st = gDdk->Memory->MapPage(virtBase + (uintptr_t)off, physBase + off, flags, NtlDdkMapFailIfPresent); if (!KSUCCESS(st)) return st; } @@ -616,10 +611,11 @@ __declspec(dllexport) KSTATUS PciEnableMsi(DEVICE_OBJECT* pdo, uint8_t irqSlot) if (!cap) return NTLSTATUS_NOT_SUPPORTED; - uint32_t bspLapic = HalGetBspLapicId(); - if (!HalApicUsingX2Apic() && bspLapic >= 256u) + uint32_t bspLapic = gDdk->Platform->GetBspLapicId(); + uint8_t x2Apic = gDdk->Platform->IsX2ApicEnabled(); + if (!x2Apic && bspLapic >= 256u) return NTLSTATUS_NOT_SUPPORTED; - if (HalApicUsingX2Apic() && bspLapic >= 256u) { + if (x2Apic && bspLapic >= 256u) { // Extended x2APIC MSI destinations need interrupt-remapping awareness. return NTLSTATUS_NOT_SUPPORTED; } @@ -655,7 +651,7 @@ __declspec(dllexport) KSTATUS PciEnableMsi(DEVICE_OBJECT* pdo, uint8_t irqSlot) cmd |= PCI_COMMAND_INTX_DISABLE; PciRawWrite16(bus, dev, fn, PCI_REG_COMMAND_STATUS, cmd); - DbgPrint("pci: MSI enabled %02x:%02x.%u cap=0x%02x vector=0x%02x irqslot=%u dest=%u %s\n", + gDdk->Debug->Print("pci: MSI enabled %02x:%02x.%u cap=0x%02x vector=0x%02x irqslot=%u dest=%u %s\n", bus, dev, fn, cap, vector, irqSlot, bspLapic, is64 ? "64-bit" : "32-bit"); return NTLSTATUS_SUCCESS; } @@ -670,7 +666,7 @@ __declspec(dllexport) KSTATUS PciEnableMsiAuto(DEVICE_OBJECT* pdo, uint8_t* outI return NTLSTATUS_NOT_SUPPORTED; uint8_t irq = 0xFFu; - KSTATUS st = KeIrqAllocateMsiVector(&irq); + KSTATUS st = gDdk->Interrupt->AllocateMsiVector(&irq); if (!KSUCCESS(st)) return st; @@ -683,9 +679,10 @@ __declspec(dllexport) KSTATUS PciEnableMsiAuto(DEVICE_OBJECT* pdo, uint8_t* outI } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - if (!hal) return NTLSTATUS_INVALID_PARAMETER; - gHal = hal; +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk || !ddk->Debug || !ddk->Interrupt || !ddk->Memory || !ddk->Platform) return NTLSTATUS_INVALID_PARAMETER; + gDdk = ddk; gPciDeviceCount = 0; IoInitializeDriverObject(&gPciDriver, SYS_SV_LITERAL("pci")); @@ -694,8 +691,8 @@ KSTATUS DriverEntry(const HAL_API* hal) { KSTATUS st = IoRegisterDriverObject(&gPciDriver); if (!KSUCCESS(st)) return st; - DbgPrint("pci: DriverEntry ABI=%u\n", PciDriverAbiVersion()); + gDdk->Debug->Print("pci: DriverEntry ABI=%u\n", PciDriverAbiVersion()); PciEnumerateBus(); - DbgPrint("pci: enumeration complete, devices=%u\n", gPciDeviceCount); + gDdk->Debug->Print("pci: enumeration complete, devices=%u\n", gPciDeviceCount); return NTLSTATUS_SUCCESS; } diff --git a/code/drivers/bus/usb/usb.c b/code/drivers/bus/usb/usb.c index db79df4..ba1419b 100644 --- a/code/drivers/bus/usb/usb.c +++ b/code/drivers/bus/usb/usb.c @@ -3,7 +3,7 @@ #include "usb.h" DRIVER_OBJECT gXhciDriver; -const HAL_API* gUsbHal; +const NTL_DDK* gUsbDdk; static const IO_DEVICE_ID gXhciIds[] = { { IoBusPci, { "PCI\\CC_0C0330", sizeof("PCI\\CC_0C0330") - 1 } }, @@ -35,10 +35,11 @@ static KSTATUS UsbInitializeXhciDriver(void) { } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - if (!hal) return NTLSTATUS_INVALID_PARAMETER; +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk || !ddk->Memory || !ddk->Memory->PhysToVirt || !ddk->Timer) return NTLSTATUS_INVALID_PARAMETER; DbgPrint("usb: driver loading\n"); - gUsbHal = hal; + gUsbDdk = ddk; KSTATUS st = UsbInitializeBusModel(); if (!KSUCCESS(st)) { diff --git a/code/drivers/bus/usb/usb.h b/code/drivers/bus/usb/usb.h index 9a5cb93..ba6930c 100644 --- a/code/drivers/bus/usb/usb.h +++ b/code/drivers/bus/usb/usb.h @@ -8,21 +8,19 @@ #include #include -#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #ifndef USB_DEBUG_VERBOSE #define USB_DEBUG_VERBOSE 0 @@ -761,7 +759,7 @@ typedef struct XHCI_WAIT_TARGET { typedef struct XHCI_CONTROLLER { uint32_t Magic; - const HAL_API* Hal; + const NTL_DDK* Ddk; DEVICE_OBJECT* Fdo; DEVICE_OBJECT* Pdo; DEVICE_OBJECT* LowerDevice; @@ -837,7 +835,7 @@ extern DRIVER_OBJECT gUsbCompositeDriver; extern DRIVER_OBJECT gUsbHidDriver; extern DRIVER_OBJECT gUsbHubDriver; extern DRIVER_OBJECT gXhciDriver; -extern const HAL_API* gUsbHal; +extern const NTL_DDK* gUsbDdk; KSTATUS UsbInitializeBusModel(void); KSTATUS UsbInitializeCompositeDriver(void); @@ -881,9 +879,9 @@ uint32_t XhciRead32(volatile uint8_t* base, uint32_t reg); void XhciWrite32(volatile uint8_t* base, uint32_t reg, uint32_t value); uint64_t XhciRead64(volatile uint8_t* base, uint32_t reg); void XhciWrite64(volatile uint8_t* base, uint32_t reg, uint64_t value); -void UsbDelayUs(const HAL_API* hal, uint32_t us); -bool UsbWaitSet32(const HAL_API* hal, volatile uint8_t* base, uint32_t reg, uint32_t mask, uint32_t timeoutUs); -bool UsbWaitClear32(const HAL_API* hal, volatile uint8_t* base, uint32_t reg, uint32_t mask, uint32_t timeoutUs); +void UsbDelayUs(const NTL_DDK* ddk, uint32_t us); +bool UsbWaitSet32(const NTL_DDK* ddk, volatile uint8_t* base, uint32_t reg, uint32_t mask, uint32_t timeoutUs); +bool UsbWaitClear32(const NTL_DDK* ddk, volatile uint8_t* base, uint32_t reg, uint32_t mask, uint32_t timeoutUs); void* UsbDmaAllocPages(XHCI_CONTROLLER* xhci, size_t pages, PHYSICAL_ADDRESS* outPhys); uint16_t XhciScratchpadCount(uint32_t hcs2); uint32_t XhciTrbType(const XHCI_TRB* trb); diff --git a/code/drivers/bus/usb/usb_hub.c b/code/drivers/bus/usb/usb_hub.c index 05e8ac2..534f57d 100644 --- a/code/drivers/bus/usb/usb_hub.c +++ b/code/drivers/bus/usb/usb_hub.c @@ -87,7 +87,7 @@ static KSTATUS UsbHubEnumerateRootPortWithRetries(USB_HUB_EXTENSION* hub, DbgPrint("usb-hub: root port %u enumeration attempt %u failed st=0x%x; retrying\n", port, attempt, last); - UsbDelayUs(xhci->Hal, 50000); + UsbDelayUs(xhci->Ddk, 50000); } if (UsbHubRootPortConnected(xhci, port)) { @@ -346,7 +346,7 @@ static KSTATUS UsbHubResetExternalPort(USB_HUB_EXTENSION* hub, uint8_t port, uin USB_HUB_PORT_STATUS ps; memset(&ps, 0, sizeof(ps)); for (uint32_t i = 0; i < 500u; i++) { - UsbDelayUs(((XHCI_CONTROLLER*)hub->Hcd->ControllerContext)->Hal, 1000u); + UsbDelayUs(((XHCI_CONTROLLER*)hub->Hcd->ControllerContext)->Ddk, 1000u); st = UsbHubGetPortStatus(hub, port, &ps); if (!KSUCCESS(st)) return st; @@ -416,7 +416,7 @@ static void UsbHubHandleExternalPortChange(USB_HUB_EXTENSION* hub, uint8_t port) hub->ChildSlot[port] = USB_HUB_PORT_ENUMERATING; hub->ChildPortState[port] = UsbHubPortConnectedDebounce; - UsbDelayUs(((XHCI_CONTROLLER*)hub->Hcd->ControllerContext)->Hal, 30000u); + UsbDelayUs(((XHCI_CONTROLLER*)hub->Hcd->ControllerContext)->Ddk, 30000u); uint8_t speed = 0; hub->ChildPortState[port] = UsbHubPortResetting; @@ -504,7 +504,7 @@ static void UsbHubHandleRootPortChange(USB_HUB_EXTENSION* hub, uint8_t port) { hub->RootPortSlot[port] = USB_HUB_PORT_ENUMERATING; hub->RootPortState[port] = UsbHubPortConnectedDebounce; - UsbDelayUs(xhci->Hal, 30000); + UsbDelayUs(xhci->Ddk, 30000); portsc = XhciRead32(xhci->Op, XhciPortReg(port)); if (!(portsc & XHCI_PORTSC_CCS)) { UsbHubClearRootPortFailure(hub, port); @@ -806,7 +806,7 @@ static KSTATUS UsbHubStartExternalDevice(DEVICE_OBJECT* device, USB_HUB_EXTENSIO for (uint8_t port = 1; port <= hub->PortCount; port++) (void)UsbHubSetPortFeature(hub, port, USB_HUB_PORT_FEAT_POWER); - UsbDelayUs(((XHCI_CONTROLLER*)hub->Hcd->ControllerContext)->Hal, + UsbDelayUs(((XHCI_CONTROLLER*)hub->Hcd->ControllerContext)->Ddk, (uint32_t)hub->PowerOnToPowerGoodMs * 1000u); st = KeSemaphoreCreate(0, 0x7fffffff, &hub->WorkerSemaphore); diff --git a/code/drivers/bus/usb/usb_storage.c b/code/drivers/bus/usb/usb_storage.c index 184a76b..b5677d8 100644 --- a/code/drivers/bus/usb/usb_storage.c +++ b/code/drivers/bus/usb/usb_storage.c @@ -223,7 +223,7 @@ KSTATUS UsbStorageTestUnitReady(USB_STORAGE_EXTENSION* storage) { last = st; (void)UsbStorageRequestSense(storage); - UsbDelayUs(xhci->Hal, 10000u); + UsbDelayUs(xhci->Ddk, 10000u); } return last; @@ -302,7 +302,7 @@ void UsbStorageAcquireIo(USB_STORAGE_EXTENSION* storage) { if (!storage) return; XHCI_CONTROLLER* xhci = storage->Device ? (XHCI_CONTROLLER*)storage->Device->Hcd->ControllerContext : (XHCI_CONTROLLER*)0; while (_InterlockedCompareExchange(&storage->IoBusy, 1, 0) != 0) { - if (xhci) UsbDelayUs(xhci->Hal, 10); + if (xhci) UsbDelayUs(xhci->Ddk, 10); } } diff --git a/code/drivers/bus/usb/usb_xhci.c b/code/drivers/bus/usb/usb_xhci.c index 7a24fe9..842b319 100644 --- a/code/drivers/bus/usb/usb_xhci.c +++ b/code/drivers/bus/usb/usb_xhci.c @@ -48,27 +48,27 @@ void XhciWrite64(volatile uint8_t* base, uint32_t reg, uint64_t value) { } // Implements the delay Us operation. -void UsbDelayUs(const HAL_API* hal, uint32_t us) { - if (hal && hal->Timer.Stall) hal->Timer.Stall(us); +void UsbDelayUs(const NTL_DDK* ddk, uint32_t us) { + if (ddk && ddk->Timer && ddk->Timer->Stall) ddk->Timer->Stall(us); else { for (uint32_t i = 0; i < us * 32u; i++) _mm_pause(); } } -bool UsbWaitSet32(const HAL_API* hal, volatile uint8_t* base, uint32_t reg, +bool UsbWaitSet32(const NTL_DDK* ddk, volatile uint8_t* base, uint32_t reg, uint32_t mask, uint32_t timeoutUs) { for (uint32_t i = 0; i < timeoutUs; i++) { if ((XhciRead32(base, reg) & mask) == mask) return true; - UsbDelayUs(hal, 1); + UsbDelayUs(ddk, 1); } return false; } -bool UsbWaitClear32(const HAL_API* hal, volatile uint8_t* base, uint32_t reg, +bool UsbWaitClear32(const NTL_DDK* ddk, volatile uint8_t* base, uint32_t reg, uint32_t mask, uint32_t timeoutUs) { for (uint32_t i = 0; i < timeoutUs; i++) { if ((XhciRead32(base, reg) & mask) == 0) return true; - UsbDelayUs(hal, 1); + UsbDelayUs(ddk, 1); } return false; } @@ -95,7 +95,7 @@ void* UsbDmaAllocPages(XHCI_CONTROLLER* xhci, size_t pages, return NULL; } - void* virt = xhci->Hal->PhysToVirt(phys); + void* virt = xhci->Ddk->Memory->PhysToVirt(phys); memset(virt, 0, pages * (size_t)PAGE_SIZE); *outPhys = phys; return virt; @@ -312,7 +312,7 @@ void XhciPowerRootPorts(XHCI_CONTROLLER* xhci) { } if (powered) { - UsbDelayUs(xhci->Hal, 20000u); + UsbDelayUs(xhci->Ddk, 20000u); DbgPrint("usb: xHCI powered %u previously-off root port(s)\n", powered); } } @@ -518,7 +518,7 @@ KSTATUS XhciWaitForArmedTarget(XHCI_CONTROLLER* xhci, XHCI_WAIT_TARGET* target, KeInsertQueueDpc(&xhci->EventDpc, (void*)0, (void*)0); } - UsbDelayUs(xhci->Hal, 1); + UsbDelayUs(xhci->Ddk, 1); } XhciUnregisterWaitTarget(xhci, target); @@ -612,7 +612,7 @@ KSTATUS XhciBiosHandoff(XHCI_CONTROLLER* xhci) { ok = true; break; } - UsbDelayUs(xhci->Hal, 1); + UsbDelayUs(xhci->Ddk, 1); } if (!ok) { DbgPrint("usb: xHCI BIOS handoff timed out; continuing anyway\n"); @@ -635,7 +635,7 @@ KSTATUS XhciStopAndReset(XHCI_CONTROLLER* xhci) { uint32_t cmd = XhciRead32(xhci->Op, XHCI_OP_USBCMD); if (cmd & XHCI_USBCMD_RS) { XhciWrite32(xhci->Op, XHCI_OP_USBCMD, cmd & ~XHCI_USBCMD_RS); - if (!UsbWaitSet32(xhci->Hal, xhci->Op, XHCI_OP_USBSTS, + if (!UsbWaitSet32(xhci->Ddk, xhci->Op, XHCI_OP_USBSTS, XHCI_USBSTS_HCH, 1000000u)) { DbgPrint("usb: xHCI stop timeout usbsts=%08x\n", XhciRead32(xhci->Op, XHCI_OP_USBSTS)); @@ -644,14 +644,14 @@ KSTATUS XhciStopAndReset(XHCI_CONTROLLER* xhci) { } XhciWrite32(xhci->Op, XHCI_OP_USBCMD, XHCI_USBCMD_HCRST); - if (!UsbWaitClear32(xhci->Hal, xhci->Op, XHCI_OP_USBCMD, + if (!UsbWaitClear32(xhci->Ddk, xhci->Op, XHCI_OP_USBCMD, XHCI_USBCMD_HCRST, 1000000u)) { DbgPrint("usb: xHCI reset timeout usbcmd=%08x\n", XhciRead32(xhci->Op, XHCI_OP_USBCMD)); return NTLSTATUS_TIMEOUT; } - if (!UsbWaitClear32(xhci->Hal, xhci->Op, XHCI_OP_USBSTS, + if (!UsbWaitClear32(xhci->Ddk, xhci->Op, XHCI_OP_USBSTS, XHCI_USBSTS_CNR, 1000000u)) { DbgPrint("usb: xHCI controller-not-ready timeout usbsts=%08x\n", XhciRead32(xhci->Op, XHCI_OP_USBSTS)); @@ -932,7 +932,7 @@ KSTATUS XhciStart(XHCI_CONTROLLER* xhci) { cmd |= XHCI_USBCMD_RS; XhciWrite32(xhci->Op, XHCI_OP_USBCMD, cmd); - if (!UsbWaitClear32(xhci->Hal, xhci->Op, XHCI_OP_USBSTS, + if (!UsbWaitClear32(xhci->Ddk, xhci->Op, XHCI_OP_USBSTS, XHCI_USBSTS_HCH, 1000000u)) { DbgPrint("usb: xHCI start timeout usbsts=%08x\n", XhciRead32(xhci->Op, XHCI_OP_USBSTS)); @@ -1004,7 +1004,7 @@ KSTATUS XhciResetPort(XHCI_CONTROLLER* xhci, uint8_t port, uint8_t* outSpeed) { break; } XhciDrainEventRingLocked(xhci, NULL); - UsbDelayUs(xhci->Hal, 1); + UsbDelayUs(xhci->Ddk, 1); } XhciClearPortChanges(xhci, port); @@ -1033,7 +1033,7 @@ KSTATUS XhciResetPort(XHCI_CONTROLLER* xhci, uint8_t port, uint8_t* outSpeed) { break; } XhciDrainEventRingLocked(xhci, NULL); - UsbDelayUs(xhci->Hal, 1); + UsbDelayUs(xhci->Ddk, 1); } if (!resetDone) { @@ -2076,7 +2076,7 @@ KSTATUS XhciAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject XHCI_CONTROLLER* xhci = (XHCI_CONTROLLER*)fdo->DeviceExtension; memset(xhci, 0, sizeof(*xhci)); xhci->Magic = XHCI_CONTROLLER_MAGIC; - xhci->Hal = gUsbHal; + xhci->Ddk = gUsbDdk; xhci->Fdo = fdo; xhci->Pdo = physicalDeviceObject; xhci->Irq = 0xFFu; diff --git a/code/drivers/display/vmwaresvga/vmwaresvga.c b/code/drivers/display/vmwaresvga/vmwaresvga.c index 482649f..5fc0bae 100644 --- a/code/drivers/display/vmwaresvga/vmwaresvga.c +++ b/code/drivers/display/vmwaresvga/vmwaresvga.c @@ -2,7 +2,7 @@ #include "vmwaresvga.h" -const HAL_API* gVmwSvgaHal; +const NTL_DDK* gVmwSvgaDdk; static DRIVER_OBJECT gVmwSvgaDriver; @@ -1436,12 +1436,13 @@ KSTATUS VmwSvgaAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObj } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - if (!hal) +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk) return NTLSTATUS_INVALID_PARAMETER; DbgPrint("VMWSVGA: driver loading...\n"); - gVmwSvgaHal = hal; + gVmwSvgaDdk = ddk; memset(&gVmwSvgaDriver, 0, sizeof(gVmwSvgaDriver)); IoInitializeDriverObject(&gVmwSvgaDriver, SYS_SV_LITERAL("vmwaresvga")); diff --git a/code/drivers/display/vmwaresvga/vmwaresvga.h b/code/drivers/display/vmwaresvga/vmwaresvga.h index 5641a07..a096d77 100644 --- a/code/drivers/display/vmwaresvga/vmwaresvga.h +++ b/code/drivers/display/vmwaresvga/vmwaresvga.h @@ -10,14 +10,14 @@ #include #include -#include +#include #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #define VMWSVGA_VENDOR_VMWARE 0x15ADu #define VMWSVGA_DEVICE_SVGA2 0x0405u @@ -210,7 +210,7 @@ typedef struct VMWSVGA_DEVICE { DISPLAY_DEVICE DisplayDevice; } VMWSVGA_DEVICE; -extern const HAL_API* gVmwSvgaHal; +extern const NTL_DDK* gVmwSvgaDdk; KSTATUS VmwSvgaAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject); KSTATUS VmwSvgaDispatchPnp(DEVICE_OBJECT* device, IRP* irp); diff --git a/code/drivers/fs/fat32/fat32.c b/code/drivers/fs/fat32/fat32.c index 3b3de6b..a03a0a8 100644 --- a/code/drivers/fs/fat32/fat32.c +++ b/code/drivers/fs/fat32/fat32.c @@ -3429,12 +3429,12 @@ static void Fat32DiskChange(uint8_t driveIndex, } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API *hal) { +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { DbgPrint("FAT32: Init\n"); - if (!hal) return NTLSTATUS_INVALID_PARAMETER; + if (!ddk) return NTLSTATUS_INVALID_PARAMETER; FatCacheInvalidate(); - (void)hal; + (void)init; gMountedCount = 0; memset(gDiskScanned, 0, sizeof(gDiskScanned)); diff --git a/code/drivers/fs/fat32/fat32.h b/code/drivers/fs/fat32/fat32.h index 46ce269..520763f 100644 --- a/code/drivers/fs/fat32/fat32.h +++ b/code/drivers/fs/fat32/fat32.h @@ -7,17 +7,17 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include typedef struct FAT32_VOL_S FAT32_VOL; diff --git a/code/drivers/fs/ntfs/ntfs.c b/code/drivers/fs/ntfs/ntfs.c index bac8d7a..ed11ff5 100644 --- a/code/drivers/fs/ntfs/ntfs.c +++ b/code/drivers/fs/ntfs/ntfs.c @@ -7,12 +7,12 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define NTFS_MAX_VOLUMES 8u #define NTFS_MAX_PARTITIONS_PER_DISK 32u @@ -1690,10 +1690,10 @@ static void NtfsDiskChange(uint8_t driveIndex, DEVICE_OBJECT* device, IO_DEVICE_ } } -KSTATUS DriverEntry(const HAL_API* hal) { +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { DbgPrint("NTFS: Init\n"); - if (!hal) return NTLSTATUS_INVALID_PARAMETER; - (void)hal; + if (!ddk) return NTLSTATUS_INVALID_PARAMETER; + (void)init; memset(gVolumes, 0, sizeof(gVolumes)); memset(gFilesystems, 0, sizeof(gFilesystems)); memset(gVolumeMounted, 0, sizeof(gVolumeMounted)); diff --git a/code/drivers/input/ps2/ps2.c b/code/drivers/input/ps2/ps2.c index 293cb31..7a763bf 100644 --- a/code/drivers/input/ps2/ps2.c +++ b/code/drivers/input/ps2/ps2.c @@ -282,8 +282,9 @@ static void Ps2MouseInitialize(void) { } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - (void)hal; +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)ddk; + (void)init; uint32_t keyboardId = 0, mouseId = 0; KeInputRegisterDevice("ps2-keyboard", 0, &keyboardId); diff --git a/code/drivers/input/ps2/ps2.h b/code/drivers/input/ps2/ps2.h index 2a07990..857206c 100644 --- a/code/drivers/input/ps2/ps2.h +++ b/code/drivers/input/ps2/ps2.h @@ -7,11 +7,11 @@ #include #include -#include +#include #include -#include -#include -#include +#include +#include +#include #define PS2_DATA 0x60u #define PS2_STAT 0x64u diff --git a/code/drivers/input/serial/serial.c b/code/drivers/input/serial/serial.c index 583d26a..03b4ab4 100644 --- a/code/drivers/input/serial/serial.c +++ b/code/drivers/input/serial/serial.c @@ -6,11 +6,11 @@ #include #include -#include +#include #include -#include -#include -#include +#include +#include +#include #define SERIAL_COM1_BASE 0x3F8u #define SERIAL_COM1_IRQ 4u @@ -319,8 +319,9 @@ static void SerialInitializeCom1(void) { } // DriverEntry registers COM1 as an input source. -KSTATUS DriverEntry(const HAL_API* hal) { - (void)hal; +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)ddk; + (void)init; uint32_t deviceId = 0; KSTATUS st = KeInputRegisterDevice("serial-com1", 0, &deviceId); diff --git a/code/drivers/net/lwip/README.md b/code/drivers/net/lwip/README.md index 7f16d4b..633852b 100644 --- a/code/drivers/net/lwip/README.md +++ b/code/drivers/net/lwip/README.md @@ -13,10 +13,10 @@ The core kernel owns only: Build notes: - Do not use lwIP CMake. -- `build.bat` compiles the sources listed in `drivers/lwip/lwip_sources.txt`. +- `build.bat` compiles the sources listed in `drivers/net/lwip/lwip_sources.txt`. - Include directories: - - `code/drivers/lwip/include` - - `code/third_party/lwip/src/include` + - `code/drivers/net/lwip/include` + - `code/drivers/net/lwip/third_party/lwip/src/include` Load order: diff --git a/code/drivers/net/lwip/include/arch/cc.h b/code/drivers/net/lwip/include/arch/cc.h index d247a64..19d1b2d 100644 --- a/code/drivers/net/lwip/include/arch/cc.h +++ b/code/drivers/net/lwip/include/arch/cc.h @@ -4,7 +4,7 @@ #include #include -#include +#include #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 diff --git a/code/drivers/net/lwip/lwip_sources.txt b/code/drivers/net/lwip/lwip_sources.txt index eed9768..44b394f 100644 --- a/code/drivers/net/lwip/lwip_sources.txt +++ b/code/drivers/net/lwip/lwip_sources.txt @@ -1,62 +1,62 @@ # Add these lwIP 2.2.1 files to the lwip.sys driver build. # Include directories required: # code/drivers/net/lwip/include -# code/third_party/lwip/src/include +# code/drivers/net/lwip/third_party/lwip/src/include # Port glue drivers/net/lwip/lwip_sys_arch.c drivers/net/lwip/lwip_stack.c # lwIP core -third_party/lwip/src/core/init.c -third_party/lwip/src/core/def.c -third_party/lwip/src/core/dns.c -third_party/lwip/src/core/inet_chksum.c -third_party/lwip/src/core/ip.c -third_party/lwip/src/core/mem.c -third_party/lwip/src/core/memp.c -third_party/lwip/src/core/netif.c -third_party/lwip/src/core/pbuf.c -third_party/lwip/src/core/raw.c -third_party/lwip/src/core/stats.c -third_party/lwip/src/core/sys.c -third_party/lwip/src/core/altcp.c -third_party/lwip/src/core/altcp_alloc.c -third_party/lwip/src/core/altcp_tcp.c -third_party/lwip/src/core/tcp.c -third_party/lwip/src/core/tcp_in.c -third_party/lwip/src/core/tcp_out.c -third_party/lwip/src/core/timeouts.c -third_party/lwip/src/core/udp.c +drivers/net/lwip/third_party/lwip/src/core/init.c +drivers/net/lwip/third_party/lwip/src/core/def.c +drivers/net/lwip/third_party/lwip/src/core/dns.c +drivers/net/lwip/third_party/lwip/src/core/inet_chksum.c +drivers/net/lwip/third_party/lwip/src/core/ip.c +drivers/net/lwip/third_party/lwip/src/core/mem.c +drivers/net/lwip/third_party/lwip/src/core/memp.c +drivers/net/lwip/third_party/lwip/src/core/netif.c +drivers/net/lwip/third_party/lwip/src/core/pbuf.c +drivers/net/lwip/third_party/lwip/src/core/raw.c +drivers/net/lwip/third_party/lwip/src/core/stats.c +drivers/net/lwip/third_party/lwip/src/core/sys.c +drivers/net/lwip/third_party/lwip/src/core/altcp.c +drivers/net/lwip/third_party/lwip/src/core/altcp_alloc.c +drivers/net/lwip/third_party/lwip/src/core/altcp_tcp.c +drivers/net/lwip/third_party/lwip/src/core/tcp.c +drivers/net/lwip/third_party/lwip/src/core/tcp_in.c +drivers/net/lwip/third_party/lwip/src/core/tcp_out.c +drivers/net/lwip/third_party/lwip/src/core/timeouts.c +drivers/net/lwip/third_party/lwip/src/core/udp.c # IPv4 -third_party/lwip/src/core/ipv4/acd.c -third_party/lwip/src/core/ipv4/autoip.c -third_party/lwip/src/core/ipv4/dhcp.c -third_party/lwip/src/core/ipv4/etharp.c -third_party/lwip/src/core/ipv4/icmp.c -third_party/lwip/src/core/ipv4/igmp.c -third_party/lwip/src/core/ipv4/ip4_frag.c -third_party/lwip/src/core/ipv4/ip4.c -third_party/lwip/src/core/ipv4/ip4_addr.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/acd.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/autoip.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/dhcp.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/etharp.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/icmp.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/igmp.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4_frag.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4.c +drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4_addr.c # IPv6 -third_party/lwip/src/core/ipv6/dhcp6.c -third_party/lwip/src/core/ipv6/ethip6.c -third_party/lwip/src/core/ipv6/icmp6.c -third_party/lwip/src/core/ipv6/inet6.c -third_party/lwip/src/core/ipv6/ip6_frag.c -third_party/lwip/src/core/ipv6/ip6.c -third_party/lwip/src/core/ipv6/ip6_addr.c -third_party/lwip/src/core/ipv6/mld6.c -third_party/lwip/src/core/ipv6/nd6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/dhcp6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/ethip6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/icmp6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/inet6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6_frag.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6_addr.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/mld6.c +drivers/net/lwip/third_party/lwip/src/core/ipv6/nd6.c # netconn/socket API -third_party/lwip/src/api/api_lib.c -third_party/lwip/src/api/api_msg.c -third_party/lwip/src/api/err.c -third_party/lwip/src/api/netbuf.c -third_party/lwip/src/api/tcpip.c +drivers/net/lwip/third_party/lwip/src/api/api_lib.c +drivers/net/lwip/third_party/lwip/src/api/api_msg.c +drivers/net/lwip/third_party/lwip/src/api/err.c +drivers/net/lwip/third_party/lwip/src/api/netbuf.c +drivers/net/lwip/third_party/lwip/src/api/tcpip.c # Ethernet netif helper -third_party/lwip/src/netif/ethernet.c +drivers/net/lwip/third_party/lwip/src/netif/ethernet.c diff --git a/code/drivers/net/lwip/lwip_stack.c b/code/drivers/net/lwip/lwip_stack.c index 16fb1a7..921646c 100644 --- a/code/drivers/net/lwip/lwip_stack.c +++ b/code/drivers/net/lwip/lwip_stack.c @@ -5,15 +5,15 @@ #include #include -#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include @@ -100,6 +100,7 @@ typedef struct LWIP_PROVIDER_SOCKET { static LWIP_BINDING* gBindings[LWIP_MAX_NETIFS]; static volatile int gLwipInitialized = 0; +static const NTL_DDK* gLwipDdk; static KSTATUS LwipProviderAttachDevice(NET_DEVICE* device); static KSTATUS LwipProviderReceiveFrame(NET_DEVICE* device, const void* frame, size_t length); @@ -753,14 +754,23 @@ static void LwipInitDone(void* arg) { KeSignalSemaphore(sem); } +// Delays the current provider thread through the DDK scheduler table. +static KSTATUS LwipDelayThread(uint64_t milliseconds) { + if (!gLwipDdk || !gLwipDdk->Scheduler || !gLwipDdk->Scheduler->DelayThread) + return NTLSTATUS_INVALID_PARAMETER; + return gLwipDdk->Scheduler->DelayThread(milliseconds); +} + // Implements the stack Initialize operation. -static KSTATUS LwipStackInitialize(const HAL_API* hal) { +static KSTATUS LwipStackInitialize(const NTL_DDK* ddk) { if (gLwipInitialized) return NTLSTATUS_SUCCESS; - if (!hal || !hal->Timer.QueryTicks) + if (!ddk || !ddk->Timer || !ddk->Timer->QueryTicks || + !ddk->Scheduler || !ddk->Scheduler->DelayThread) return NTLSTATUS_INVALID_PARAMETER; - LwipPortSetTimerQuery(hal->Timer.QueryTicks); + gLwipDdk = ddk; + LwipPortSetTimerQuery(ddk->Timer->QueryTicks); SEMAPHORE* done = 0; KSTATUS st = KeSemaphoreCreate(0, 1, &done); @@ -1148,7 +1158,7 @@ static KSTATUS LwipProviderConnect(void* socket, const SYS_SOCKET_ADDRESS_K* add } LwipSocketUnlock(s); - (void)KeDelayThread(LWIP_PROVIDER_CANCEL_POLL_MS); + (void)LwipDelayThread(LWIP_PROVIDER_CANCEL_POLL_MS); st = LwipSocketLock(s); if (!KSUCCESS(st)) return st; @@ -1716,7 +1726,8 @@ static KSTATUS LwipDispatchInternalDeviceControl(DEVICE_OBJECT* device, IRP* irp } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; DbgPrint("lwIP: driver loading...\n"); LWIP_NETIF_CONFIG defaultConfig; @@ -1727,7 +1738,7 @@ KSTATUS DriverEntry(const HAL_API* hal) { return st; } - st = LwipStackInitialize(hal); + st = LwipStackInitialize(ddk); if (!KSUCCESS(st)) { DbgPrint("lwIP: initialization failed: 0x%x\n", st); return st; diff --git a/code/drivers/net/lwip/lwip_sys_arch.c b/code/drivers/net/lwip/lwip_sys_arch.c index 446af3b..1d70545 100644 --- a/code/drivers/net/lwip/lwip_sys_arch.c +++ b/code/drivers/net/lwip/lwip_sys_arch.c @@ -5,19 +5,19 @@ #include #include #include -#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #define LWIP_PORT_MBOX_DEFAULT_SIZE 128u diff --git a/code/third_party/lwip/COPYING b/code/drivers/net/lwip/third_party/lwip/COPYING similarity index 100% rename from code/third_party/lwip/COPYING rename to code/drivers/net/lwip/third_party/lwip/COPYING diff --git a/code/third_party/lwip/FILES b/code/drivers/net/lwip/third_party/lwip/FILES similarity index 100% rename from code/third_party/lwip/FILES rename to code/drivers/net/lwip/third_party/lwip/FILES diff --git a/code/third_party/lwip/README b/code/drivers/net/lwip/third_party/lwip/README similarity index 100% rename from code/third_party/lwip/README rename to code/drivers/net/lwip/third_party/lwip/README diff --git a/code/third_party/lwip/src/FILES b/code/drivers/net/lwip/third_party/lwip/src/FILES similarity index 100% rename from code/third_party/lwip/src/FILES rename to code/drivers/net/lwip/third_party/lwip/src/FILES diff --git a/code/third_party/lwip/src/Filelists.cmake b/code/drivers/net/lwip/third_party/lwip/src/Filelists.cmake similarity index 100% rename from code/third_party/lwip/src/Filelists.cmake rename to code/drivers/net/lwip/third_party/lwip/src/Filelists.cmake diff --git a/code/third_party/lwip/src/Filelists.mk b/code/drivers/net/lwip/third_party/lwip/src/Filelists.mk similarity index 100% rename from code/third_party/lwip/src/Filelists.mk rename to code/drivers/net/lwip/third_party/lwip/src/Filelists.mk diff --git a/code/third_party/lwip/src/api/api_lib.c b/code/drivers/net/lwip/third_party/lwip/src/api/api_lib.c similarity index 100% rename from code/third_party/lwip/src/api/api_lib.c rename to code/drivers/net/lwip/third_party/lwip/src/api/api_lib.c diff --git a/code/third_party/lwip/src/api/api_msg.c b/code/drivers/net/lwip/third_party/lwip/src/api/api_msg.c similarity index 100% rename from code/third_party/lwip/src/api/api_msg.c rename to code/drivers/net/lwip/third_party/lwip/src/api/api_msg.c diff --git a/code/third_party/lwip/src/api/err.c b/code/drivers/net/lwip/third_party/lwip/src/api/err.c similarity index 100% rename from code/third_party/lwip/src/api/err.c rename to code/drivers/net/lwip/third_party/lwip/src/api/err.c diff --git a/code/third_party/lwip/src/api/if_api.c b/code/drivers/net/lwip/third_party/lwip/src/api/if_api.c similarity index 100% rename from code/third_party/lwip/src/api/if_api.c rename to code/drivers/net/lwip/third_party/lwip/src/api/if_api.c diff --git a/code/third_party/lwip/src/api/netbuf.c b/code/drivers/net/lwip/third_party/lwip/src/api/netbuf.c similarity index 100% rename from code/third_party/lwip/src/api/netbuf.c rename to code/drivers/net/lwip/third_party/lwip/src/api/netbuf.c diff --git a/code/third_party/lwip/src/api/netdb.c b/code/drivers/net/lwip/third_party/lwip/src/api/netdb.c similarity index 100% rename from code/third_party/lwip/src/api/netdb.c rename to code/drivers/net/lwip/third_party/lwip/src/api/netdb.c diff --git a/code/third_party/lwip/src/api/netifapi.c b/code/drivers/net/lwip/third_party/lwip/src/api/netifapi.c similarity index 100% rename from code/third_party/lwip/src/api/netifapi.c rename to code/drivers/net/lwip/third_party/lwip/src/api/netifapi.c diff --git a/code/third_party/lwip/src/api/sockets.c b/code/drivers/net/lwip/third_party/lwip/src/api/sockets.c similarity index 100% rename from code/third_party/lwip/src/api/sockets.c rename to code/drivers/net/lwip/third_party/lwip/src/api/sockets.c diff --git a/code/third_party/lwip/src/api/tcpip.c b/code/drivers/net/lwip/third_party/lwip/src/api/tcpip.c similarity index 100% rename from code/third_party/lwip/src/api/tcpip.c rename to code/drivers/net/lwip/third_party/lwip/src/api/tcpip.c diff --git a/code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c b/code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c similarity index 100% rename from code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls.c diff --git a/code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c b/code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c similarity index 100% rename from code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c diff --git a/code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h b/code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h similarity index 100% rename from code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_mem.h diff --git a/code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h b/code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h similarity index 100% rename from code/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/altcp_tls/altcp_tls_mbedtls_structs.h diff --git a/code/third_party/lwip/src/apps/http/altcp_proxyconnect.c b/code/drivers/net/lwip/third_party/lwip/src/apps/http/altcp_proxyconnect.c similarity index 100% rename from code/third_party/lwip/src/apps/http/altcp_proxyconnect.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/altcp_proxyconnect.c diff --git a/code/third_party/lwip/src/apps/http/fs.c b/code/drivers/net/lwip/third_party/lwip/src/apps/http/fs.c similarity index 100% rename from code/third_party/lwip/src/apps/http/fs.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/fs.c diff --git a/code/third_party/lwip/src/apps/http/fs/404.html b/code/drivers/net/lwip/third_party/lwip/src/apps/http/fs/404.html similarity index 100% rename from code/third_party/lwip/src/apps/http/fs/404.html rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/fs/404.html diff --git a/code/third_party/lwip/src/apps/http/fs/img/sics.gif b/code/drivers/net/lwip/third_party/lwip/src/apps/http/fs/img/sics.gif similarity index 100% rename from code/third_party/lwip/src/apps/http/fs/img/sics.gif rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/fs/img/sics.gif diff --git a/code/third_party/lwip/src/apps/http/fs/index.html b/code/drivers/net/lwip/third_party/lwip/src/apps/http/fs/index.html similarity index 100% rename from code/third_party/lwip/src/apps/http/fs/index.html rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/fs/index.html diff --git a/code/third_party/lwip/src/apps/http/fsdata.c b/code/drivers/net/lwip/third_party/lwip/src/apps/http/fsdata.c similarity index 100% rename from code/third_party/lwip/src/apps/http/fsdata.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/fsdata.c diff --git a/code/third_party/lwip/src/apps/http/fsdata.h b/code/drivers/net/lwip/third_party/lwip/src/apps/http/fsdata.h similarity index 100% rename from code/third_party/lwip/src/apps/http/fsdata.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/fsdata.h diff --git a/code/third_party/lwip/src/apps/http/http_client.c b/code/drivers/net/lwip/third_party/lwip/src/apps/http/http_client.c similarity index 100% rename from code/third_party/lwip/src/apps/http/http_client.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/http_client.c diff --git a/code/third_party/lwip/src/apps/http/httpd.c b/code/drivers/net/lwip/third_party/lwip/src/apps/http/httpd.c similarity index 100% rename from code/third_party/lwip/src/apps/http/httpd.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/httpd.c diff --git a/code/third_party/lwip/src/apps/http/httpd_structs.h b/code/drivers/net/lwip/third_party/lwip/src/apps/http/httpd_structs.h similarity index 100% rename from code/third_party/lwip/src/apps/http/httpd_structs.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/httpd_structs.h diff --git a/code/third_party/lwip/src/apps/http/makefsdata/makefsdata b/code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/makefsdata similarity index 100% rename from code/third_party/lwip/src/apps/http/makefsdata/makefsdata rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/makefsdata diff --git a/code/third_party/lwip/src/apps/http/makefsdata/makefsdata.c b/code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/makefsdata.c similarity index 100% rename from code/third_party/lwip/src/apps/http/makefsdata/makefsdata.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/makefsdata.c diff --git a/code/third_party/lwip/src/apps/http/makefsdata/readme.txt b/code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/readme.txt similarity index 100% rename from code/third_party/lwip/src/apps/http/makefsdata/readme.txt rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/readme.txt diff --git a/code/third_party/lwip/src/apps/http/makefsdata/tinydir.h b/code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/tinydir.h similarity index 100% rename from code/third_party/lwip/src/apps/http/makefsdata/tinydir.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/http/makefsdata/tinydir.h diff --git a/code/third_party/lwip/src/apps/lwiperf/lwiperf.c b/code/drivers/net/lwip/third_party/lwip/src/apps/lwiperf/lwiperf.c similarity index 100% rename from code/third_party/lwip/src/apps/lwiperf/lwiperf.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/lwiperf/lwiperf.c diff --git a/code/third_party/lwip/src/apps/mdns/mdns.c b/code/drivers/net/lwip/third_party/lwip/src/apps/mdns/mdns.c similarity index 100% rename from code/third_party/lwip/src/apps/mdns/mdns.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/mdns/mdns.c diff --git a/code/third_party/lwip/src/apps/mdns/mdns_domain.c b/code/drivers/net/lwip/third_party/lwip/src/apps/mdns/mdns_domain.c similarity index 100% rename from code/third_party/lwip/src/apps/mdns/mdns_domain.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/mdns/mdns_domain.c diff --git a/code/third_party/lwip/src/apps/mdns/mdns_out.c b/code/drivers/net/lwip/third_party/lwip/src/apps/mdns/mdns_out.c similarity index 100% rename from code/third_party/lwip/src/apps/mdns/mdns_out.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/mdns/mdns_out.c diff --git a/code/third_party/lwip/src/apps/mqtt/mqtt.c b/code/drivers/net/lwip/third_party/lwip/src/apps/mqtt/mqtt.c similarity index 100% rename from code/third_party/lwip/src/apps/mqtt/mqtt.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/mqtt/mqtt.c diff --git a/code/third_party/lwip/src/apps/netbiosns/netbiosns.c b/code/drivers/net/lwip/third_party/lwip/src/apps/netbiosns/netbiosns.c similarity index 100% rename from code/third_party/lwip/src/apps/netbiosns/netbiosns.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/netbiosns/netbiosns.c diff --git a/code/third_party/lwip/src/apps/smtp/smtp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/smtp/smtp.c similarity index 100% rename from code/third_party/lwip/src/apps/smtp/smtp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/smtp/smtp.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_asn1.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_asn1.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_asn1.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_asn1.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_asn1.h b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_asn1.h similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_asn1.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_asn1.h diff --git a/code/third_party/lwip/src/apps/snmp/snmp_core.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_core.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_core.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_core.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_core_priv.h b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_core_priv.h similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_core_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_core_priv.h diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_icmp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_icmp.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_icmp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_icmp.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_interfaces.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_interfaces.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_interfaces.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_interfaces.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_ip.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_ip.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_ip.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_ip.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_snmp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_snmp.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_snmp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_snmp.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_system.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_system.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_system.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_system.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_tcp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_tcp.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_tcp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_tcp.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_mib2_udp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_udp.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_mib2_udp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_mib2_udp.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_msg.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_msg.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_msg.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_msg.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_msg.h b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_msg.h similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_msg.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_msg.h diff --git a/code/third_party/lwip/src/apps/snmp/snmp_netconn.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_netconn.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_netconn.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_netconn.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.h b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.h similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_pbuf_stream.h diff --git a/code/third_party/lwip/src/apps/snmp/snmp_raw.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_raw.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_raw.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_raw.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_scalar.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_scalar.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_scalar.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_scalar.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_snmpv2_framework.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_snmpv2_framework.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_snmpv2_framework.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_snmpv2_framework.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_snmpv2_usm.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_snmpv2_usm.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_snmpv2_usm.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_snmpv2_usm.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_table.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_table.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_table.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_table.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_threadsync.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_threadsync.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_threadsync.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_threadsync.c diff --git a/code/third_party/lwip/src/apps/snmp/snmp_traps.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_traps.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmp_traps.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmp_traps.c diff --git a/code/third_party/lwip/src/apps/snmp/snmpv3.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmpv3.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmpv3.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmpv3.c diff --git a/code/third_party/lwip/src/apps/snmp/snmpv3_mbedtls.c b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmpv3_mbedtls.c similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmpv3_mbedtls.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmpv3_mbedtls.c diff --git a/code/third_party/lwip/src/apps/snmp/snmpv3_priv.h b/code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmpv3_priv.h similarity index 100% rename from code/third_party/lwip/src/apps/snmp/snmpv3_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/apps/snmp/snmpv3_priv.h diff --git a/code/third_party/lwip/src/apps/sntp/sntp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/sntp/sntp.c similarity index 100% rename from code/third_party/lwip/src/apps/sntp/sntp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/sntp/sntp.c diff --git a/code/third_party/lwip/src/apps/tftp/tftp.c b/code/drivers/net/lwip/third_party/lwip/src/apps/tftp/tftp.c similarity index 100% rename from code/third_party/lwip/src/apps/tftp/tftp.c rename to code/drivers/net/lwip/third_party/lwip/src/apps/tftp/tftp.c diff --git a/code/third_party/lwip/src/core/altcp.c b/code/drivers/net/lwip/third_party/lwip/src/core/altcp.c similarity index 100% rename from code/third_party/lwip/src/core/altcp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/altcp.c diff --git a/code/third_party/lwip/src/core/altcp_alloc.c b/code/drivers/net/lwip/third_party/lwip/src/core/altcp_alloc.c similarity index 100% rename from code/third_party/lwip/src/core/altcp_alloc.c rename to code/drivers/net/lwip/third_party/lwip/src/core/altcp_alloc.c diff --git a/code/third_party/lwip/src/core/altcp_tcp.c b/code/drivers/net/lwip/third_party/lwip/src/core/altcp_tcp.c similarity index 100% rename from code/third_party/lwip/src/core/altcp_tcp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/altcp_tcp.c diff --git a/code/third_party/lwip/src/core/def.c b/code/drivers/net/lwip/third_party/lwip/src/core/def.c similarity index 100% rename from code/third_party/lwip/src/core/def.c rename to code/drivers/net/lwip/third_party/lwip/src/core/def.c diff --git a/code/third_party/lwip/src/core/dns.c b/code/drivers/net/lwip/third_party/lwip/src/core/dns.c similarity index 100% rename from code/third_party/lwip/src/core/dns.c rename to code/drivers/net/lwip/third_party/lwip/src/core/dns.c diff --git a/code/third_party/lwip/src/core/inet_chksum.c b/code/drivers/net/lwip/third_party/lwip/src/core/inet_chksum.c similarity index 100% rename from code/third_party/lwip/src/core/inet_chksum.c rename to code/drivers/net/lwip/third_party/lwip/src/core/inet_chksum.c diff --git a/code/third_party/lwip/src/core/init.c b/code/drivers/net/lwip/third_party/lwip/src/core/init.c similarity index 100% rename from code/third_party/lwip/src/core/init.c rename to code/drivers/net/lwip/third_party/lwip/src/core/init.c diff --git a/code/third_party/lwip/src/core/ip.c b/code/drivers/net/lwip/third_party/lwip/src/core/ip.c similarity index 100% rename from code/third_party/lwip/src/core/ip.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ip.c diff --git a/code/third_party/lwip/src/core/ipv4/acd.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/acd.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/acd.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/acd.c diff --git a/code/third_party/lwip/src/core/ipv4/autoip.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/autoip.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/autoip.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/autoip.c diff --git a/code/third_party/lwip/src/core/ipv4/dhcp.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/dhcp.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/dhcp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/dhcp.c diff --git a/code/third_party/lwip/src/core/ipv4/etharp.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/etharp.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/etharp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/etharp.c diff --git a/code/third_party/lwip/src/core/ipv4/icmp.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/icmp.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/icmp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/icmp.c diff --git a/code/third_party/lwip/src/core/ipv4/igmp.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/igmp.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/igmp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/igmp.c diff --git a/code/third_party/lwip/src/core/ipv4/ip4.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/ip4.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4.c diff --git a/code/third_party/lwip/src/core/ipv4/ip4_addr.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4_addr.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/ip4_addr.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4_addr.c diff --git a/code/third_party/lwip/src/core/ipv4/ip4_frag.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4_frag.c similarity index 100% rename from code/third_party/lwip/src/core/ipv4/ip4_frag.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv4/ip4_frag.c diff --git a/code/third_party/lwip/src/core/ipv6/dhcp6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/dhcp6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/dhcp6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/dhcp6.c diff --git a/code/third_party/lwip/src/core/ipv6/ethip6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ethip6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/ethip6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ethip6.c diff --git a/code/third_party/lwip/src/core/ipv6/icmp6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/icmp6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/icmp6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/icmp6.c diff --git a/code/third_party/lwip/src/core/ipv6/inet6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/inet6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/inet6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/inet6.c diff --git a/code/third_party/lwip/src/core/ipv6/ip6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/ip6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6.c diff --git a/code/third_party/lwip/src/core/ipv6/ip6_addr.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6_addr.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/ip6_addr.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6_addr.c diff --git a/code/third_party/lwip/src/core/ipv6/ip6_frag.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6_frag.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/ip6_frag.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/ip6_frag.c diff --git a/code/third_party/lwip/src/core/ipv6/mld6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/mld6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/mld6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/mld6.c diff --git a/code/third_party/lwip/src/core/ipv6/nd6.c b/code/drivers/net/lwip/third_party/lwip/src/core/ipv6/nd6.c similarity index 100% rename from code/third_party/lwip/src/core/ipv6/nd6.c rename to code/drivers/net/lwip/third_party/lwip/src/core/ipv6/nd6.c diff --git a/code/third_party/lwip/src/core/mem.c b/code/drivers/net/lwip/third_party/lwip/src/core/mem.c similarity index 100% rename from code/third_party/lwip/src/core/mem.c rename to code/drivers/net/lwip/third_party/lwip/src/core/mem.c diff --git a/code/third_party/lwip/src/core/memp.c b/code/drivers/net/lwip/third_party/lwip/src/core/memp.c similarity index 100% rename from code/third_party/lwip/src/core/memp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/memp.c diff --git a/code/third_party/lwip/src/core/netif.c b/code/drivers/net/lwip/third_party/lwip/src/core/netif.c similarity index 100% rename from code/third_party/lwip/src/core/netif.c rename to code/drivers/net/lwip/third_party/lwip/src/core/netif.c diff --git a/code/third_party/lwip/src/core/pbuf.c b/code/drivers/net/lwip/third_party/lwip/src/core/pbuf.c similarity index 100% rename from code/third_party/lwip/src/core/pbuf.c rename to code/drivers/net/lwip/third_party/lwip/src/core/pbuf.c diff --git a/code/third_party/lwip/src/core/raw.c b/code/drivers/net/lwip/third_party/lwip/src/core/raw.c similarity index 100% rename from code/third_party/lwip/src/core/raw.c rename to code/drivers/net/lwip/third_party/lwip/src/core/raw.c diff --git a/code/third_party/lwip/src/core/stats.c b/code/drivers/net/lwip/third_party/lwip/src/core/stats.c similarity index 100% rename from code/third_party/lwip/src/core/stats.c rename to code/drivers/net/lwip/third_party/lwip/src/core/stats.c diff --git a/code/third_party/lwip/src/core/sys.c b/code/drivers/net/lwip/third_party/lwip/src/core/sys.c similarity index 100% rename from code/third_party/lwip/src/core/sys.c rename to code/drivers/net/lwip/third_party/lwip/src/core/sys.c diff --git a/code/third_party/lwip/src/core/tcp.c b/code/drivers/net/lwip/third_party/lwip/src/core/tcp.c similarity index 100% rename from code/third_party/lwip/src/core/tcp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/tcp.c diff --git a/code/third_party/lwip/src/core/tcp_in.c b/code/drivers/net/lwip/third_party/lwip/src/core/tcp_in.c similarity index 100% rename from code/third_party/lwip/src/core/tcp_in.c rename to code/drivers/net/lwip/third_party/lwip/src/core/tcp_in.c diff --git a/code/third_party/lwip/src/core/tcp_out.c b/code/drivers/net/lwip/third_party/lwip/src/core/tcp_out.c similarity index 100% rename from code/third_party/lwip/src/core/tcp_out.c rename to code/drivers/net/lwip/third_party/lwip/src/core/tcp_out.c diff --git a/code/third_party/lwip/src/core/timeouts.c b/code/drivers/net/lwip/third_party/lwip/src/core/timeouts.c similarity index 100% rename from code/third_party/lwip/src/core/timeouts.c rename to code/drivers/net/lwip/third_party/lwip/src/core/timeouts.c diff --git a/code/third_party/lwip/src/core/udp.c b/code/drivers/net/lwip/third_party/lwip/src/core/udp.c similarity index 100% rename from code/third_party/lwip/src/core/udp.c rename to code/drivers/net/lwip/third_party/lwip/src/core/udp.c diff --git a/code/third_party/lwip/src/include/compat/posix/arpa/inet.h b/code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/arpa/inet.h similarity index 100% rename from code/third_party/lwip/src/include/compat/posix/arpa/inet.h rename to code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/arpa/inet.h diff --git a/code/third_party/lwip/src/include/compat/posix/net/if.h b/code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/net/if.h similarity index 100% rename from code/third_party/lwip/src/include/compat/posix/net/if.h rename to code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/net/if.h diff --git a/code/third_party/lwip/src/include/compat/posix/netdb.h b/code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/netdb.h similarity index 100% rename from code/third_party/lwip/src/include/compat/posix/netdb.h rename to code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/netdb.h diff --git a/code/third_party/lwip/src/include/compat/posix/sys/socket.h b/code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/sys/socket.h similarity index 100% rename from code/third_party/lwip/src/include/compat/posix/sys/socket.h rename to code/drivers/net/lwip/third_party/lwip/src/include/compat/posix/sys/socket.h diff --git a/code/third_party/lwip/src/include/compat/stdc/errno.h b/code/drivers/net/lwip/third_party/lwip/src/include/compat/stdc/errno.h similarity index 100% rename from code/third_party/lwip/src/include/compat/stdc/errno.h rename to code/drivers/net/lwip/third_party/lwip/src/include/compat/stdc/errno.h diff --git a/code/third_party/lwip/src/include/lwip/acd.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/acd.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/acd.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/acd.h diff --git a/code/third_party/lwip/src/include/lwip/altcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/altcp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/altcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/altcp.h diff --git a/code/third_party/lwip/src/include/lwip/altcp_tcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/altcp_tcp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/altcp_tcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/altcp_tcp.h diff --git a/code/third_party/lwip/src/include/lwip/altcp_tls.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/altcp_tls.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/altcp_tls.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/altcp_tls.h diff --git a/code/third_party/lwip/src/include/lwip/api.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/api.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/api.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/api.h diff --git a/code/third_party/lwip/src/include/lwip/apps/FILES b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/FILES similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/FILES rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/FILES diff --git a/code/third_party/lwip/src/include/lwip/apps/altcp_proxyconnect.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/altcp_proxyconnect.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/altcp_proxyconnect.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/altcp_proxyconnect.h diff --git a/code/third_party/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/altcp_tls_mbedtls_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/fs.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/fs.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/fs.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/fs.h diff --git a/code/third_party/lwip/src/include/lwip/apps/http_client.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/http_client.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/http_client.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/http_client.h diff --git a/code/third_party/lwip/src/include/lwip/apps/httpd.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/httpd.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/httpd.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/httpd.h diff --git a/code/third_party/lwip/src/include/lwip/apps/httpd_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/httpd_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/httpd_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/httpd_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/lwiperf.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/lwiperf.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/lwiperf.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/lwiperf.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mdns.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mdns.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mdns_domain.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_domain.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mdns_domain.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_domain.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mdns_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mdns_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mdns_out.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_out.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mdns_out.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_out.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mdns_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mdns_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mdns_priv.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mqtt.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mqtt.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mqtt.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mqtt.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mqtt_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mqtt_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mqtt_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mqtt_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/mqtt_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mqtt_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/mqtt_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/mqtt_priv.h diff --git a/code/third_party/lwip/src/include/lwip/apps/netbiosns.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/netbiosns.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/netbiosns.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/netbiosns.h diff --git a/code/third_party/lwip/src/include/lwip/apps/netbiosns_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/netbiosns_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/netbiosns_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/netbiosns_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/smtp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/smtp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/smtp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/smtp.h diff --git a/code/third_party/lwip/src/include/lwip/apps/smtp_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/smtp_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/smtp_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/smtp_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_core.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_core.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_core.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_core.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_mib2.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_mib2.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_mib2.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_mib2.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_scalar.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_scalar.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_scalar.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_scalar.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_framework.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_snmpv2_usm.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_table.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_table.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_table.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_table.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmp_threadsync.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_threadsync.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmp_threadsync.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmp_threadsync.h diff --git a/code/third_party/lwip/src/include/lwip/apps/snmpv3.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmpv3.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/snmpv3.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/snmpv3.h diff --git a/code/third_party/lwip/src/include/lwip/apps/sntp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/sntp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/sntp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/sntp.h diff --git a/code/third_party/lwip/src/include/lwip/apps/sntp_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/sntp_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/sntp_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/sntp_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/tftp_client.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_client.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/tftp_client.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_client.h diff --git a/code/third_party/lwip/src/include/lwip/apps/tftp_common.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_common.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/tftp_common.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_common.h diff --git a/code/third_party/lwip/src/include/lwip/apps/tftp_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_opts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/tftp_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_opts.h diff --git a/code/third_party/lwip/src/include/lwip/apps/tftp_server.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_server.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/apps/tftp_server.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/apps/tftp_server.h diff --git a/code/third_party/lwip/src/include/lwip/arch.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/arch.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/arch.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/arch.h diff --git a/code/third_party/lwip/src/include/lwip/autoip.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/autoip.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/autoip.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/autoip.h diff --git a/code/third_party/lwip/src/include/lwip/debug.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/debug.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/debug.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/debug.h diff --git a/code/third_party/lwip/src/include/lwip/def.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/def.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/def.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/def.h diff --git a/code/third_party/lwip/src/include/lwip/dhcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/dhcp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/dhcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/dhcp.h diff --git a/code/third_party/lwip/src/include/lwip/dhcp6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/dhcp6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/dhcp6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/dhcp6.h diff --git a/code/third_party/lwip/src/include/lwip/dns.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/dns.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/dns.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/dns.h diff --git a/code/third_party/lwip/src/include/lwip/err.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/err.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/err.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/err.h diff --git a/code/third_party/lwip/src/include/lwip/errno.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/errno.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/errno.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/errno.h diff --git a/code/third_party/lwip/src/include/lwip/etharp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/etharp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/etharp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/etharp.h diff --git a/code/third_party/lwip/src/include/lwip/ethip6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ethip6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ethip6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ethip6.h diff --git a/code/third_party/lwip/src/include/lwip/icmp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/icmp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/icmp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/icmp.h diff --git a/code/third_party/lwip/src/include/lwip/icmp6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/icmp6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/icmp6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/icmp6.h diff --git a/code/third_party/lwip/src/include/lwip/if_api.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/if_api.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/if_api.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/if_api.h diff --git a/code/third_party/lwip/src/include/lwip/igmp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/igmp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/igmp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/igmp.h diff --git a/code/third_party/lwip/src/include/lwip/inet.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/inet.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/inet.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/inet.h diff --git a/code/third_party/lwip/src/include/lwip/inet_chksum.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/inet_chksum.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/inet_chksum.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/inet_chksum.h diff --git a/code/third_party/lwip/src/include/lwip/init.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/init.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/init.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/init.h diff --git a/code/third_party/lwip/src/include/lwip/init.h.cmake.in b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/init.h.cmake.in similarity index 100% rename from code/third_party/lwip/src/include/lwip/init.h.cmake.in rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/init.h.cmake.in diff --git a/code/third_party/lwip/src/include/lwip/ip.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip.h diff --git a/code/third_party/lwip/src/include/lwip/ip4.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip4.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip4.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip4.h diff --git a/code/third_party/lwip/src/include/lwip/ip4_addr.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip4_addr.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip4_addr.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip4_addr.h diff --git a/code/third_party/lwip/src/include/lwip/ip4_frag.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip4_frag.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip4_frag.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip4_frag.h diff --git a/code/third_party/lwip/src/include/lwip/ip6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6.h diff --git a/code/third_party/lwip/src/include/lwip/ip6_addr.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6_addr.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip6_addr.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6_addr.h diff --git a/code/third_party/lwip/src/include/lwip/ip6_frag.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6_frag.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip6_frag.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6_frag.h diff --git a/code/third_party/lwip/src/include/lwip/ip6_zone.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6_zone.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip6_zone.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip6_zone.h diff --git a/code/third_party/lwip/src/include/lwip/ip_addr.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip_addr.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/ip_addr.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/ip_addr.h diff --git a/code/third_party/lwip/src/include/lwip/mem.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/mem.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/mem.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/mem.h diff --git a/code/third_party/lwip/src/include/lwip/memp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/memp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/memp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/memp.h diff --git a/code/third_party/lwip/src/include/lwip/mld6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/mld6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/mld6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/mld6.h diff --git a/code/third_party/lwip/src/include/lwip/nd6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/nd6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/nd6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/nd6.h diff --git a/code/third_party/lwip/src/include/lwip/netbuf.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/netbuf.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/netbuf.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/netbuf.h diff --git a/code/third_party/lwip/src/include/lwip/netdb.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/netdb.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/netdb.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/netdb.h diff --git a/code/third_party/lwip/src/include/lwip/netif.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/netif.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/netif.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/netif.h diff --git a/code/third_party/lwip/src/include/lwip/netifapi.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/netifapi.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/netifapi.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/netifapi.h diff --git a/code/third_party/lwip/src/include/lwip/opt.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/opt.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/opt.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/opt.h diff --git a/code/third_party/lwip/src/include/lwip/pbuf.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/pbuf.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/pbuf.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/pbuf.h diff --git a/code/third_party/lwip/src/include/lwip/priv/altcp_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/altcp_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/altcp_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/altcp_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/api_msg.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/api_msg.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/api_msg.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/api_msg.h diff --git a/code/third_party/lwip/src/include/lwip/priv/mem_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/mem_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/mem_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/mem_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/memp_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/memp_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/memp_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/memp_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/memp_std.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/memp_std.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/memp_std.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/memp_std.h diff --git a/code/third_party/lwip/src/include/lwip/priv/nd6_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/nd6_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/nd6_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/nd6_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/raw_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/raw_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/raw_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/raw_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/sockets_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/sockets_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/sockets_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/sockets_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/tcp_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/tcp_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/tcp_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/tcp_priv.h diff --git a/code/third_party/lwip/src/include/lwip/priv/tcpip_priv.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/tcpip_priv.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/priv/tcpip_priv.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/priv/tcpip_priv.h diff --git a/code/third_party/lwip/src/include/lwip/prot/acd.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/acd.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/acd.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/acd.h diff --git a/code/third_party/lwip/src/include/lwip/prot/autoip.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/autoip.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/autoip.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/autoip.h diff --git a/code/third_party/lwip/src/include/lwip/prot/dhcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/dhcp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/dhcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/dhcp.h diff --git a/code/third_party/lwip/src/include/lwip/prot/dhcp6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/dhcp6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/dhcp6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/dhcp6.h diff --git a/code/third_party/lwip/src/include/lwip/prot/dns.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/dns.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/dns.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/dns.h diff --git a/code/third_party/lwip/src/include/lwip/prot/etharp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/etharp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/etharp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/etharp.h diff --git a/code/third_party/lwip/src/include/lwip/prot/ethernet.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ethernet.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/ethernet.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ethernet.h diff --git a/code/third_party/lwip/src/include/lwip/prot/iana.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/iana.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/iana.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/iana.h diff --git a/code/third_party/lwip/src/include/lwip/prot/icmp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/icmp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/icmp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/icmp.h diff --git a/code/third_party/lwip/src/include/lwip/prot/icmp6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/icmp6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/icmp6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/icmp6.h diff --git a/code/third_party/lwip/src/include/lwip/prot/ieee.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ieee.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/ieee.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ieee.h diff --git a/code/third_party/lwip/src/include/lwip/prot/igmp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/igmp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/igmp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/igmp.h diff --git a/code/third_party/lwip/src/include/lwip/prot/ip.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ip.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/ip.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ip.h diff --git a/code/third_party/lwip/src/include/lwip/prot/ip4.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ip4.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/ip4.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ip4.h diff --git a/code/third_party/lwip/src/include/lwip/prot/ip6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ip6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/ip6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/ip6.h diff --git a/code/third_party/lwip/src/include/lwip/prot/mld6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/mld6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/mld6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/mld6.h diff --git a/code/third_party/lwip/src/include/lwip/prot/nd6.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/nd6.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/nd6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/nd6.h diff --git a/code/third_party/lwip/src/include/lwip/prot/tcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/tcp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/tcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/tcp.h diff --git a/code/third_party/lwip/src/include/lwip/prot/udp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/udp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/prot/udp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/prot/udp.h diff --git a/code/third_party/lwip/src/include/lwip/raw.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/raw.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/raw.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/raw.h diff --git a/code/third_party/lwip/src/include/lwip/sio.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/sio.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/sio.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/sio.h diff --git a/code/third_party/lwip/src/include/lwip/snmp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/snmp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/snmp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/snmp.h diff --git a/code/third_party/lwip/src/include/lwip/sockets.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/sockets.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/sockets.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/sockets.h diff --git a/code/third_party/lwip/src/include/lwip/stats.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/stats.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/stats.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/stats.h diff --git a/code/third_party/lwip/src/include/lwip/sys.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/sys.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/sys.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/sys.h diff --git a/code/third_party/lwip/src/include/lwip/tcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/tcp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/tcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/tcp.h diff --git a/code/third_party/lwip/src/include/lwip/tcpbase.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/tcpbase.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/tcpbase.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/tcpbase.h diff --git a/code/third_party/lwip/src/include/lwip/tcpip.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/tcpip.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/tcpip.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/tcpip.h diff --git a/code/third_party/lwip/src/include/lwip/timeouts.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/timeouts.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/timeouts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/timeouts.h diff --git a/code/third_party/lwip/src/include/lwip/udp.h b/code/drivers/net/lwip/third_party/lwip/src/include/lwip/udp.h similarity index 100% rename from code/third_party/lwip/src/include/lwip/udp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/lwip/udp.h diff --git a/code/third_party/lwip/src/include/netif/bridgeif.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/bridgeif.h similarity index 100% rename from code/third_party/lwip/src/include/netif/bridgeif.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/bridgeif.h diff --git a/code/third_party/lwip/src/include/netif/bridgeif_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/bridgeif_opts.h similarity index 100% rename from code/third_party/lwip/src/include/netif/bridgeif_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/bridgeif_opts.h diff --git a/code/third_party/lwip/src/include/netif/etharp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/etharp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/etharp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/etharp.h diff --git a/code/third_party/lwip/src/include/netif/ethernet.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ethernet.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ethernet.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ethernet.h diff --git a/code/third_party/lwip/src/include/netif/ieee802154.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ieee802154.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ieee802154.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ieee802154.h diff --git a/code/third_party/lwip/src/include/netif/lowpan6.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6.h similarity index 100% rename from code/third_party/lwip/src/include/netif/lowpan6.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6.h diff --git a/code/third_party/lwip/src/include/netif/lowpan6_ble.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6_ble.h similarity index 100% rename from code/third_party/lwip/src/include/netif/lowpan6_ble.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6_ble.h diff --git a/code/third_party/lwip/src/include/netif/lowpan6_common.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6_common.h similarity index 100% rename from code/third_party/lwip/src/include/netif/lowpan6_common.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6_common.h diff --git a/code/third_party/lwip/src/include/netif/lowpan6_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6_opts.h similarity index 100% rename from code/third_party/lwip/src/include/netif/lowpan6_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/lowpan6_opts.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ccp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ccp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ccp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ccp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/chap-md5.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/chap-md5.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/chap-md5.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/chap-md5.h diff --git a/code/third_party/lwip/src/include/netif/ppp/chap-new.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/chap-new.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/chap-new.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/chap-new.h diff --git a/code/third_party/lwip/src/include/netif/ppp/chap_ms.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/chap_ms.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/chap_ms.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/chap_ms.h diff --git a/code/third_party/lwip/src/include/netif/ppp/eap.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/eap.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/eap.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/eap.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ecp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ecp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ecp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ecp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/eui64.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/eui64.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/eui64.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/eui64.h diff --git a/code/third_party/lwip/src/include/netif/ppp/fsm.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/fsm.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/fsm.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/fsm.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ipcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ipcp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ipcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ipcp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ipv6cp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ipv6cp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ipv6cp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ipv6cp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/lcp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/lcp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/lcp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/lcp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/magic.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/magic.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/magic.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/magic.h diff --git a/code/third_party/lwip/src/include/netif/ppp/mppe.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/mppe.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/mppe.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/mppe.h diff --git a/code/third_party/lwip/src/include/netif/ppp/polarssl/arc4.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/arc4.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/polarssl/arc4.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/arc4.h diff --git a/code/third_party/lwip/src/include/netif/ppp/polarssl/des.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/des.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/polarssl/des.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/des.h diff --git a/code/third_party/lwip/src/include/netif/ppp/polarssl/md4.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/md4.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/polarssl/md4.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/md4.h diff --git a/code/third_party/lwip/src/include/netif/ppp/polarssl/md5.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/md5.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/polarssl/md5.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/md5.h diff --git a/code/third_party/lwip/src/include/netif/ppp/polarssl/sha1.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/sha1.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/polarssl/sha1.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/polarssl/sha1.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ppp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ppp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ppp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ppp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ppp_impl.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ppp_impl.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ppp_impl.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ppp_impl.h diff --git a/code/third_party/lwip/src/include/netif/ppp/ppp_opts.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ppp_opts.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/ppp_opts.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/ppp_opts.h diff --git a/code/third_party/lwip/src/include/netif/ppp/pppapi.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppapi.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/pppapi.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppapi.h diff --git a/code/third_party/lwip/src/include/netif/ppp/pppcrypt.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppcrypt.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/pppcrypt.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppcrypt.h diff --git a/code/third_party/lwip/src/include/netif/ppp/pppdebug.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppdebug.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/pppdebug.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppdebug.h diff --git a/code/third_party/lwip/src/include/netif/ppp/pppoe.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppoe.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/pppoe.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppoe.h diff --git a/code/third_party/lwip/src/include/netif/ppp/pppol2tp.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppol2tp.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/pppol2tp.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppol2tp.h diff --git a/code/third_party/lwip/src/include/netif/ppp/pppos.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppos.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/pppos.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/pppos.h diff --git a/code/third_party/lwip/src/include/netif/ppp/upap.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/upap.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/upap.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/upap.h diff --git a/code/third_party/lwip/src/include/netif/ppp/vj.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/vj.h similarity index 100% rename from code/third_party/lwip/src/include/netif/ppp/vj.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/ppp/vj.h diff --git a/code/third_party/lwip/src/include/netif/slipif.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/slipif.h similarity index 100% rename from code/third_party/lwip/src/include/netif/slipif.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/slipif.h diff --git a/code/third_party/lwip/src/include/netif/zepif.h b/code/drivers/net/lwip/third_party/lwip/src/include/netif/zepif.h similarity index 100% rename from code/third_party/lwip/src/include/netif/zepif.h rename to code/drivers/net/lwip/third_party/lwip/src/include/netif/zepif.h diff --git a/code/third_party/lwip/src/netif/FILES b/code/drivers/net/lwip/third_party/lwip/src/netif/FILES similarity index 100% rename from code/third_party/lwip/src/netif/FILES rename to code/drivers/net/lwip/third_party/lwip/src/netif/FILES diff --git a/code/third_party/lwip/src/netif/bridgeif.c b/code/drivers/net/lwip/third_party/lwip/src/netif/bridgeif.c similarity index 100% rename from code/third_party/lwip/src/netif/bridgeif.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/bridgeif.c diff --git a/code/third_party/lwip/src/netif/bridgeif_fdb.c b/code/drivers/net/lwip/third_party/lwip/src/netif/bridgeif_fdb.c similarity index 100% rename from code/third_party/lwip/src/netif/bridgeif_fdb.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/bridgeif_fdb.c diff --git a/code/third_party/lwip/src/netif/ethernet.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ethernet.c similarity index 100% rename from code/third_party/lwip/src/netif/ethernet.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ethernet.c diff --git a/code/third_party/lwip/src/netif/lowpan6.c b/code/drivers/net/lwip/third_party/lwip/src/netif/lowpan6.c similarity index 100% rename from code/third_party/lwip/src/netif/lowpan6.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/lowpan6.c diff --git a/code/third_party/lwip/src/netif/lowpan6_ble.c b/code/drivers/net/lwip/third_party/lwip/src/netif/lowpan6_ble.c similarity index 100% rename from code/third_party/lwip/src/netif/lowpan6_ble.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/lowpan6_ble.c diff --git a/code/third_party/lwip/src/netif/lowpan6_common.c b/code/drivers/net/lwip/third_party/lwip/src/netif/lowpan6_common.c similarity index 100% rename from code/third_party/lwip/src/netif/lowpan6_common.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/lowpan6_common.c diff --git a/code/third_party/lwip/src/netif/ppp/PPPD_FOLLOWUP b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/PPPD_FOLLOWUP similarity index 100% rename from code/third_party/lwip/src/netif/ppp/PPPD_FOLLOWUP rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/PPPD_FOLLOWUP diff --git a/code/third_party/lwip/src/netif/ppp/auth.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/auth.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/auth.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/auth.c diff --git a/code/third_party/lwip/src/netif/ppp/ccp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ccp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/ccp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ccp.c diff --git a/code/third_party/lwip/src/netif/ppp/chap-md5.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/chap-md5.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/chap-md5.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/chap-md5.c diff --git a/code/third_party/lwip/src/netif/ppp/chap-new.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/chap-new.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/chap-new.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/chap-new.c diff --git a/code/third_party/lwip/src/netif/ppp/chap_ms.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/chap_ms.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/chap_ms.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/chap_ms.c diff --git a/code/third_party/lwip/src/netif/ppp/demand.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/demand.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/demand.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/demand.c diff --git a/code/third_party/lwip/src/netif/ppp/eap.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/eap.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/eap.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/eap.c diff --git a/code/third_party/lwip/src/netif/ppp/ecp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ecp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/ecp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ecp.c diff --git a/code/third_party/lwip/src/netif/ppp/eui64.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/eui64.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/eui64.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/eui64.c diff --git a/code/third_party/lwip/src/netif/ppp/fsm.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/fsm.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/fsm.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/fsm.c diff --git a/code/third_party/lwip/src/netif/ppp/ipcp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ipcp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/ipcp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ipcp.c diff --git a/code/third_party/lwip/src/netif/ppp/ipv6cp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ipv6cp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/ipv6cp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ipv6cp.c diff --git a/code/third_party/lwip/src/netif/ppp/lcp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/lcp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/lcp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/lcp.c diff --git a/code/third_party/lwip/src/netif/ppp/magic.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/magic.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/magic.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/magic.c diff --git a/code/third_party/lwip/src/netif/ppp/mppe.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/mppe.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/mppe.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/mppe.c diff --git a/code/third_party/lwip/src/netif/ppp/multilink.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/multilink.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/multilink.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/multilink.c diff --git a/code/third_party/lwip/src/netif/ppp/polarssl/README b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/README similarity index 100% rename from code/third_party/lwip/src/netif/ppp/polarssl/README rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/README diff --git a/code/third_party/lwip/src/netif/ppp/polarssl/arc4.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/arc4.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/polarssl/arc4.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/arc4.c diff --git a/code/third_party/lwip/src/netif/ppp/polarssl/des.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/des.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/polarssl/des.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/des.c diff --git a/code/third_party/lwip/src/netif/ppp/polarssl/md4.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/md4.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/polarssl/md4.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/md4.c diff --git a/code/third_party/lwip/src/netif/ppp/polarssl/md5.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/md5.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/polarssl/md5.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/md5.c diff --git a/code/third_party/lwip/src/netif/ppp/polarssl/sha1.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/sha1.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/polarssl/sha1.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/polarssl/sha1.c diff --git a/code/third_party/lwip/src/netif/ppp/ppp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ppp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/ppp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/ppp.c diff --git a/code/third_party/lwip/src/netif/ppp/pppapi.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppapi.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/pppapi.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppapi.c diff --git a/code/third_party/lwip/src/netif/ppp/pppcrypt.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppcrypt.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/pppcrypt.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppcrypt.c diff --git a/code/third_party/lwip/src/netif/ppp/pppoe.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppoe.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/pppoe.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppoe.c diff --git a/code/third_party/lwip/src/netif/ppp/pppol2tp.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppol2tp.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/pppol2tp.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppol2tp.c diff --git a/code/third_party/lwip/src/netif/ppp/pppos.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppos.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/pppos.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/pppos.c diff --git a/code/third_party/lwip/src/netif/ppp/upap.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/upap.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/upap.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/upap.c diff --git a/code/third_party/lwip/src/netif/ppp/utils.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/utils.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/utils.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/utils.c diff --git a/code/third_party/lwip/src/netif/ppp/vj.c b/code/drivers/net/lwip/third_party/lwip/src/netif/ppp/vj.c similarity index 100% rename from code/third_party/lwip/src/netif/ppp/vj.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/ppp/vj.c diff --git a/code/third_party/lwip/src/netif/slipif.c b/code/drivers/net/lwip/third_party/lwip/src/netif/slipif.c similarity index 100% rename from code/third_party/lwip/src/netif/slipif.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/slipif.c diff --git a/code/third_party/lwip/src/netif/zepif.c b/code/drivers/net/lwip/third_party/lwip/src/netif/zepif.c similarity index 100% rename from code/third_party/lwip/src/netif/zepif.c rename to code/drivers/net/lwip/third_party/lwip/src/netif/zepif.c diff --git a/code/drivers/net/rtl8139/rtl8139.c b/code/drivers/net/rtl8139/rtl8139.c index e846e3e..e3d241e 100644 --- a/code/drivers/net/rtl8139/rtl8139.c +++ b/code/drivers/net/rtl8139/rtl8139.c @@ -2,7 +2,7 @@ #include "rtl8139.h" -const HAL_API* gHal; +const NTL_DDK* gRtl8139Ddk; static DRIVER_OBJECT gRtl8139Driver; static RTL8139_DEVICE* gRtl8139Devices[RTL8139_MAX_DEVICES]; static uint32_t gRtl8139DeviceCount; @@ -69,8 +69,8 @@ static KSTATUS Rtl8139Reset(RTL8139_DEVICE* r) { for (uint32_t i = 0; i < 1000; i++) { if ((Rtl8139Read8(r, RTL8139_REG_CMD) & RTL8139_CMD_RST) == 0) return NTLSTATUS_SUCCESS; - if (gHal->Timer.Stall) - gHal->Timer.Stall(1000); + if (gRtl8139Ddk->Timer->Stall) + gRtl8139Ddk->Timer->Stall(1000); } return NTLSTATUS_TIMEOUT; } @@ -97,8 +97,8 @@ static KSTATUS Rtl8139AllocateDma(RTL8139_DEVICE* r) { return NTLSTATUS_NOT_SUPPORTED; } - r->RxBuffer = (uint8_t*)gHal->PhysToVirt(r->RxPhys); - r->TxBuffers = (uint8_t*)gHal->PhysToVirt(r->TxPhys); + r->RxBuffer = (uint8_t*)gRtl8139Ddk->Memory->PhysToVirt(r->RxPhys); + r->TxBuffers = (uint8_t*)gRtl8139Ddk->Memory->PhysToVirt(r->TxPhys); memset(r->RxBuffer, 0, PAGE_SIZE * RTL8139_RX_PAGES); memset(r->TxBuffers, 0, PAGE_SIZE * RTL8139_TX_PAGES); @@ -553,12 +553,13 @@ KSTATUS Rtl8139AddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObj } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - if (!hal) +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk || !ddk->Memory || !ddk->Memory->PhysToVirt || !ddk->Timer) return NTLSTATUS_INVALID_PARAMETER; DbgPrint("RTL8139: driver loading...\n"); - gHal = hal; + gRtl8139Ddk = ddk; gRtl8139DeviceCount = 0; memset(&gRtl8139Driver, 0, sizeof(gRtl8139Driver)); diff --git a/code/drivers/net/rtl8139/rtl8139.h b/code/drivers/net/rtl8139/rtl8139.h index f00b366..ccd2140 100644 --- a/code/drivers/net/rtl8139/rtl8139.h +++ b/code/drivers/net/rtl8139/rtl8139.h @@ -8,17 +8,15 @@ #include #include -#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #define RTL8139_VENDOR_REALTEK 0x10ECu @@ -132,7 +130,7 @@ typedef struct RTL8139_DEVICE { NET_DEVICE NetDevice; } RTL8139_DEVICE; -extern const HAL_API* gHal; +extern const NTL_DDK* gRtl8139Ddk; KSTATUS Rtl8139AddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject); KSTATUS Rtl8139DispatchPnp(DEVICE_OBJECT* device, IRP* irp); diff --git a/code/drivers/net/rtl816x/rtl816x.c b/code/drivers/net/rtl816x/rtl816x.c index 427efab..2732b29 100644 --- a/code/drivers/net/rtl816x/rtl816x.c +++ b/code/drivers/net/rtl816x/rtl816x.c @@ -2,7 +2,7 @@ #include "rtl816x.h" -const HAL_API* gHal; +const NTL_DDK* gRtl816xDdk; static DRIVER_OBJECT gRtl816xDriver; static RTL816X_DEVICE* gRtl816xDevices[RTL816X_MAX_DEVICES]; static uint32_t gRtl816xDeviceCount; @@ -70,8 +70,8 @@ static KSTATUS RtlReset(RTL816X_DEVICE* r) { for (uint32_t i = 0; i < 1000; i++) { if ((RtlRead8(r, RTL_REG_CHIP_CMD) & RTL_CMD_RESET) == 0) return NTLSTATUS_SUCCESS; - if (gHal->Timer.Stall) - gHal->Timer.Stall(1000); + if (gRtl816xDdk->Timer->Stall) + gRtl816xDdk->Timer->Stall(1000); } return NTLSTATUS_TIMEOUT; } @@ -93,10 +93,10 @@ static KSTATUS RtlAllocateDma(RTL816X_DEVICE* r) { if (!r->RxRingPhys || !r->TxRingPhys || !r->RxBuffersPhys || !r->TxBuffersPhys) return NTLSTATUS_NO_MEMORY; - r->RxRing = (RTL_DESC*)gHal->PhysToVirt(r->RxRingPhys); - r->TxRing = (RTL_DESC*)gHal->PhysToVirt(r->TxRingPhys); - r->RxBuffers = (uint8_t*)gHal->PhysToVirt(r->RxBuffersPhys); - r->TxBuffers = (uint8_t*)gHal->PhysToVirt(r->TxBuffersPhys); + r->RxRing = (RTL_DESC*)gRtl816xDdk->Memory->PhysToVirt(r->RxRingPhys); + r->TxRing = (RTL_DESC*)gRtl816xDdk->Memory->PhysToVirt(r->TxRingPhys); + r->RxBuffers = (uint8_t*)gRtl816xDdk->Memory->PhysToVirt(r->RxBuffersPhys); + r->TxBuffers = (uint8_t*)gRtl816xDdk->Memory->PhysToVirt(r->TxBuffersPhys); memset(r->RxRing, 0, PAGE_SIZE * RTL_RING_PAGES); memset(r->TxRing, 0, PAGE_SIZE * RTL_RING_PAGES); @@ -559,12 +559,13 @@ KSTATUS Rtl816xAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObj } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - if (!hal) +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk || !ddk->Memory || !ddk->Memory->PhysToVirt || !ddk->Timer) return NTLSTATUS_INVALID_PARAMETER; DbgPrint("RTL816X: driver loading...\n"); - gHal = hal; + gRtl816xDdk = ddk; gRtl816xDeviceCount = 0; memset(&gRtl816xDriver, 0, sizeof(gRtl816xDriver)); diff --git a/code/drivers/net/rtl816x/rtl816x.h b/code/drivers/net/rtl816x/rtl816x.h index d6e19eb..cfa8d00 100644 --- a/code/drivers/net/rtl816x/rtl816x.h +++ b/code/drivers/net/rtl816x/rtl816x.h @@ -8,17 +8,15 @@ #include #include -#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #define RTL_VENDOR_REALTEK 0x10ECu @@ -147,7 +145,7 @@ typedef struct RTL816X_DEVICE { NET_DEVICE NetDevice; } RTL816X_DEVICE; -extern const HAL_API* gHal; +extern const NTL_DDK* gRtl816xDdk; KSTATUS Rtl816xAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject); KSTATUS Rtl816xDispatchPnp(DEVICE_OBJECT* device, IRP* irp); diff --git a/code/drivers/storage/ahci/ahci.c b/code/drivers/storage/ahci/ahci.c index e1c6380..7e18152 100644 --- a/code/drivers/storage/ahci/ahci.c +++ b/code/drivers/storage/ahci/ahci.c @@ -2,7 +2,7 @@ #include "ahci.h" -const HAL_API *g_hal; +const NTL_DDK* gAhciDdk; DRIVER_OBJECT g_driver; static AHCI_CONTROLLER* g_controllers[MAX_AHCI_CONTROLLERS]; @@ -58,7 +58,7 @@ static KSTATUS port_init_memory(AHCI_DRIVE *drv) { drv->structPhys = MmPfnAllocateContiguous(PORT_PAGES_STRUCT, MmPfnUseDma); if (!drv->structPhys) return NTLSTATUS_NO_MEMORY; - drv->structVirt = g_hal->PhysToVirt(drv->structPhys); + drv->structVirt = gAhciDdk->Memory->PhysToVirt(drv->structPhys); // Force NOCACHE on DMA descriptor memory. MmPteProtectRange((uintptr_t)drv->structVirt, PORT_PAGES_STRUCT * 4096, flags); @@ -66,7 +66,7 @@ static KSTATUS port_init_memory(AHCI_DRIVE *drv) { drv->bouncePhys = MmPfnAllocateContiguous(BOUNCE_PAGES, MmPfnUseDma); if (!drv->bouncePhys) return NTLSTATUS_NO_MEMORY; - drv->bounceVirt = g_hal->PhysToVirt(drv->bouncePhys); + drv->bounceVirt = gAhciDdk->Memory->PhysToVirt(drv->bouncePhys); // Bounce buffer: NOCACHE to ensure CPU writes reach physical memory // before the HBA's DMA engine reads them. MmPteProtectRange((uintptr_t)drv->bounceVirt, @@ -887,9 +887,13 @@ static KSTATUS AhciAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDevic } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API *hal) { +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk || !ddk->Memory || !ddk->Memory->PhysToVirt) + return NTLSTATUS_INVALID_PARAMETER; + DbgPrint("AHCI: driver loading...\n"); - g_hal = hal; + gAhciDdk = ddk; g_controllerCount = 0; g_nextDiskIndex = 0; diff --git a/code/drivers/storage/ahci/ahci.h b/code/drivers/storage/ahci/ahci.h index 8f4f2a3..1547f32 100644 --- a/code/drivers/storage/ahci/ahci.h +++ b/code/drivers/storage/ahci/ahci.h @@ -7,16 +7,15 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include typedef enum { FIS_TYPE_REG_H2D = 0x27, @@ -379,7 +378,7 @@ struct AHCI_CONTROLLER { bool removed; }; -extern const HAL_API *g_hal; +extern const NTL_DDK* gAhciDdk; extern DRIVER_OBJECT g_driver; KSTATUS ahci_map_mmio(uint64_t physBase, uint64_t length); diff --git a/code/drivers/storage/ahci/ahci_port.c b/code/drivers/storage/ahci/ahci_port.c index 50db132..6012db0 100644 --- a/code/drivers/storage/ahci/ahci_port.c +++ b/code/drivers/storage/ahci/ahci_port.c @@ -10,7 +10,7 @@ KSTATUS ahci_map_mmio(uint64_t physBase, uint64_t length) { uint64_t pageEnd = (physBase + length + PAGE_SIZE - 1u) & ~(uint64_t)(PAGE_SIZE - 1u); int pageIndex = 0; for (uint64_t phys = pageBase; phys < pageEnd; phys += PAGE_SIZE, pageIndex++) { - uintptr_t virt = (uintptr_t)g_hal->PhysToVirt(phys); + uintptr_t virt = (uintptr_t)gAhciDdk->Memory->PhysToVirt(phys); uint64_t flags = PAGE_PRESENT | PAGE_WRITE | PAGE_NOCACHE; KSTATUS st = MmPteMapPage(virt, phys, flags, MmPteMapFailIfPresent); // Ignore NTLSTATUS_ALREADY_EXISTS - a prior mapping with different flags diff --git a/code/drivers/storage/ata/ata.c b/code/drivers/storage/ata/ata.c index e898424..adb76db 100644 --- a/code/drivers/storage/ata/ata.c +++ b/code/drivers/storage/ata/ata.c @@ -2,7 +2,7 @@ #include "ata.h" -const HAL_API* gAtaHal; +const NTL_DDK* gAtaDdk; static DRIVER_OBJECT gAtaDriver; static ATA_CONTROLLER* gAtaControllers[ATA_MAX_CONTROLLERS]; static uint32_t gAtaControllerCount; @@ -693,12 +693,13 @@ KSTATUS AtaAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject) } // Implements the driver Entry operation. -KSTATUS DriverEntry(const HAL_API* hal) { - if (!hal) +KSTATUS DriverEntry(const NTL_DDK* ddk, NTL_DRIVER_INIT* init) { + (void)init; + if (!ddk) return NTLSTATUS_INVALID_PARAMETER; DbgPrint("ATA: driver loading...\n"); - gAtaHal = hal; + gAtaDdk = ddk; gAtaControllerCount = 0; memset(&gAtaDriver, 0, sizeof(gAtaDriver)); diff --git a/code/drivers/storage/ata/ata.h b/code/drivers/storage/ata/ata.h index f3818d9..5efcdc7 100644 --- a/code/drivers/storage/ata/ata.h +++ b/code/drivers/storage/ata/ata.h @@ -8,17 +8,16 @@ #include #include -#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define ATA_CONTROLLER_MAGIC 0x41544143u // ATAC #define ATA_DEVICE_MAGIC 0x41544144u // ATAD @@ -124,7 +123,7 @@ typedef struct ATA_CONTROLLER { uint8_t DeviceCount; } ATA_CONTROLLER; -extern const HAL_API* gAtaHal; +extern const NTL_DDK* gAtaDdk; KSTATUS AtaAddDevice(DRIVER_OBJECT* driver, DEVICE_OBJECT* physicalDeviceObject); KSTATUS AtaDispatchPnp(DEVICE_OBJECT* device, IRP* irp); diff --git a/code/kernel/include/kernel/io_async.h b/code/kernel/include/kernel/io_async.h index d484026..7f588b5 100644 --- a/code/kernel/include/kernel/io_async.h +++ b/code/kernel/include/kernel/io_async.h @@ -3,61 +3,11 @@ #pragma once // io_async.h - waitable asynchronous I/O request objects. // Async request objects own the common completion, APC, wait, query, and -// cancellation surface used by file and socket I/O. +// cancellation surface used by file and socket I/O. The shared request layout is +// currently DDK-visible for legacy kernel-mode drivers; this private header owns +// only the kernel implementation entry points. -#include -#include -#include -#include -#include - -struct EVENT; -struct KAPC; -struct IRP; -typedef struct MM_LOCKED_USER_BUFFER MM_LOCKED_USER_BUFFER; - -// Completion status visible to async callers. -typedef struct IO_STATUS_BLOCK { - volatile KSTATUS Status; - volatile size_t Information; -} IO_STATUS_BLOCK; - -typedef enum IO_ASYNC_REQUEST_STATE { - IoAsyncRequestQueued = 0, - IoAsyncRequestRunning = 1, - IoAsyncRequestCompleted = 2, - IoAsyncRequestCancelled = 3, -} IO_ASYNC_REQUEST_STATE; - -typedef struct IO_ASYNC_REQUEST_OBJECT IO_ASYNC_REQUEST_OBJECT; - -typedef void (*IO_ASYNC_REQUEST_CLEANUP_ROUTINE)(IO_ASYNC_REQUEST_OBJECT* request, - void* context); -typedef KSTATUS (*IO_ASYNC_REQUEST_CANCEL_ROUTINE)(IO_ASYNC_REQUEST_OBJECT* request, - void* context); - -// Common waitable async I/O request object. -struct IO_ASYNC_REQUEST_OBJECT { - OBJECT Header; - LIST_ENTRY Link; - - IO_ASYNC_REQUEST_STATE State; - uint8_t CancelRequested; - - struct EVENT* WaitEvent; - struct EVENT* CompletionEvent; - struct KAPC* CompletionApc; - IO_STATUS_BLOCK* Iosb; - IO_STATUS_BLOCK IosbSnapshot; - MM_LOCKED_USER_BUFFER* LockedBuffer; - MM_LOCKED_USER_BUFFER* LockedIosb; - struct IRP* Irp; - - IO_ASYNC_REQUEST_CLEANUP_ROUTINE CleanupRoutine; - void* CleanupContext; - IO_ASYNC_REQUEST_CANCEL_ROUTINE CancelRoutine; - void* CancelContext; -}; +#include __declspec(dllexport) KSTATUS IoCreateAsyncRequest(size_t objectSize, IO_ASYNC_REQUEST_CLEANUP_ROUTINE cleanupRoutine, diff --git a/code/kernel/include/kernel/io_ddk.h b/code/kernel/include/kernel/io_ddk.h new file mode 100644 index 0000000..a2c5b12 --- /dev/null +++ b/code/kernel/include/kernel/io_ddk.h @@ -0,0 +1,14 @@ +// Kernel DDK-table provider declarations. + +#pragma once + +#include + +struct HAL_API; +typedef struct HAL_API HAL_API; + +// Initializes the kernel-owned DDK table from platform services. +void IoInitializeDdk(const HAL_API* hal); + +// Returns the kernel-owned DDK table passed to driver entrypoints. +const NTL_DDK* IoGetDdk(void); diff --git a/code/kernel/include/kernel/io_file.h b/code/kernel/include/kernel/io_file.h index 56a1686..928adf8 100644 --- a/code/kernel/include/kernel/io_file.h +++ b/code/kernel/include/kernel/io_file.h @@ -1,240 +1,53 @@ -// Kernel io file declarations shared by implementation files and kernel clients. +// Kernel I/O file declarations shared by filesystem, cache, and syscall code. #pragma once -// io_file.h - VFS layer -// Filesystem drivers register an IO_FILESYSTEM vtable via IoRegisterFilesystem. -// Kernel and user code open files through IoOpenFile. -#include -#include -#include -#include -#include -#include +// io_file.h - VFS and filesystem provider interface. +// Current kernel-mode filesystem drivers still use the legacy file-provider +// layout. The shared declarations live in the DDK while the real provider split +// is being designed; this private header adds kernel-only async and lock entry +// points without redefining the shared types. + +#include #include -#include -#include -#include -// Kernel/filesystem code uses the public directory-entry ABI directly. -typedef SYS_DIR_ENTRY KDIR_ENTRY; -#define KDIR_NAME_MAX SYS_DIR_NAME_MAX +struct PROCESS; -// Native asynchronous filesystem completion. Filesystems that provide -// ReadAsync/WriteAsync accept the operation, return NTLSTATUS_PENDING, and later -// call Complete(CompleteContext, status, information). Filesystems without -// these callbacks fall back to the generic VFS async worker. -typedef void (*IO_FS_ASYNC_COMPLETE)(void* completeContext, - KSTATUS status, - size_t information); - -// Filesystem-level cache and traversal statistics. -// Drivers map private metadata work onto these generic counters. -typedef struct IO_FILESYSTEM_STATS { - uint64_t PathLookups; - uint64_t PathCacheHits; - uint64_t PathCacheMisses; - uint64_t PathCacheStores; - uint64_t PathCacheInvalidations; - uint64_t PathCacheGeneration; - uint64_t DirectorySearches; - uint64_t DirectoryBlocksRead; - uint64_t DirectoryEntriesScanned; - uint64_t DataReadRuns; - uint64_t DataReadSectors; - uint64_t DataReadRunMerges; - uint64_t MaxDataReadSpanSectors; -} IO_FILESYSTEM_STATS; - -// Stable identity for a file on a mounted filesystem. -// Filesystems that can provide this let higher layers cache file-backed -// objects by file identity instead of by one FILE_OBJECT instance. -typedef struct IO_FILE_IDENTITY { - uint64_t VolumeId; - uint64_t FileId; - uint64_t Generation; - uint64_t Size; -} IO_FILE_IDENTITY; - -// Filesystem driver vtable - filled in by a filesystem driver. -typedef struct IO_FILESYSTEM { - // Open a file by absolute path (e.g. "apps\\shell.exe"). - // Returns an opaque per-file driver cookie in* fileCtx. - KSTATUS (*Open)(struct IO_FILESYSTEM* fs, - SYS_STRING_VIEW path, void **fileCtx); - - // Read up to 'size' bytes at 'offset' into 'buf'. - // Sets* bytesRead to actual bytes copied. - KSTATUS (*Read)(struct IO_FILESYSTEM* fs, void* fileCtx, - uint64_t offset, void* buf, - size_t size, size_t* bytesRead); - - KSTATUS (*Write)(struct IO_FILESYSTEM* fs, void* fileCtx, - uint64_t offset, const void* buf, - size_t size, size_t* bytesWritten); - - KSTATUS (*ReadAsync)(struct IO_FILESYSTEM* fs, void* fileCtx, - uint64_t offset, void* buf, size_t size, - IO_FS_ASYNC_COMPLETE complete, - void* completeContext); - - KSTATUS (*WriteAsync)(struct IO_FILESYSTEM* fs, void* fileCtx, - uint64_t offset, const void* buf, size_t size, - IO_FS_ASYNC_COMPLETE complete, - void* completeContext); - - // Create a new file at 'path'; returns an open fileCtx on success. - KSTATUS (*Create)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path, - void** fileCtx); - - // Delete the file at 'path'. - KSTATUS (*Delete)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path); - - // Rename or move a file/directory within the same filesystem. - KSTATUS (*Rename)(struct IO_FILESYSTEM* fs, - SYS_STRING_VIEW oldPath, SYS_STRING_VIEW newPath); - - // Create or remove directories. - KSTATUS (*CreateDir)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path); - KSTATUS (*RemoveDir)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path); - - // Truncate or extend the file to exactly 'newSize' bytes. - KSTATUS (*Truncate)(struct IO_FILESYSTEM* fs, void* fileCtx, - uint64_t newSize, uint32_t fileFlags); - - // Return the file size in bytes. - uint64_t (*GetSize)(struct IO_FILESYSTEM* fs, void* fileCtx); - - // Query metadata for an open file or path. - KSTATUS (*QueryInfo)(struct IO_FILESYSTEM* fs, void* fileCtx, - SYS_FILE_STAT* out); - KSTATUS (*Stat)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path, - SYS_FILE_STAT* out); - - // Return a stable file identity for caches that outlive one open handle. - KSTATUS (*QueryIdentity)(struct IO_FILESYSTEM* fs, void* fileCtx, - IO_FILE_IDENTITY* out); - - // Release any resources the driver allocated for fileCtx. - void (*Close)(struct IO_FILESYSTEM* fs, void* fileCtx); - - // Query cache and traversal statistics exposed through kernel stats. - void (*QueryStats)(struct IO_FILESYSTEM* fs, IO_FILESYSTEM_STATS* out); - - // Optional driver-private data. - void* DriverCtx; - - // Open a directory iterator for 'dirPath' (relative or drive-prefixed). - // Returns an opaque per-iteration driver cookie in *dirCtx. - KSTATUS (*OpenDir)(struct IO_FILESYSTEM* fs, - SYS_STRING_VIEW dirPath, void** dirCtx); - - // Advance to the next entry. - // Fills 'out' with name, attributes, and size. - // Returns NTLSTATUS_NO_MORE_FILES when the directory is exhausted. - KSTATUS (*ReadDir)(struct IO_FILESYSTEM* fs, void* dirCtx, - KDIR_ENTRY* out); - - // Release resources allocated by OpenDir. - void (*CloseDir)(struct IO_FILESYSTEM* fs, void* dirCtx); -} IO_FILESYSTEM; - -struct EVENT; -struct KAPC; -typedef struct MM_LOCKED_USER_BUFFER MM_LOCKED_USER_BUFFER; -typedef struct IO_ASYNC_FILE_REQUEST_OBJECT IO_ASYNC_FILE_REQUEST_OBJECT; - -// FILE_OBJECT - the kernel object returned to callers. -#define IO_FILE_FLAG_NO_CACHE 0x00000001u -#define IO_FILE_FLAG_SKIP_ZERO_EXTEND 0x00000002u -#define IO_FILE_FLAG_APPEND 0x00000004u - -typedef struct FILE_OBJECT { - OBJECT Header; // must be first - IO_FILESYSTEM* Fs; - void* FileCtx; // driver cookie - SPINLOCK Lock; // protects cached Size/Offset updates - uint64_t Size; - uint64_t Offset; // current position for sequential reads - uint32_t Flags; // IO_FILE_FLAG_* - uint32_t ReadaheadScore; - uint64_t ReadaheadNextOffset; - uint64_t ReadaheadIssuedUntil; - uint64_t ReadaheadSuppressedUntil; -} FILE_OBJECT; - -// DIR_OBJECT - kernel object for an open directory iterator. -typedef struct DIR_OBJECT { - OBJECT Header; // must be first - IO_FILESYSTEM* Fs; - void* DirCtx; // driver cookie (opaque iteration state) -} DIR_OBJECT; - -typedef struct IO_VOLUME_PARAMS { - uint8_t DiskIndex; // registered disk DEVICE_OBJECT index - uint64_t PartitionLba; // starting LBA of this partition - uint64_t PartitionSize; // sectors, for bounds checking -} IO_VOLUME_PARAMS; - -// Registration - called by fat32.sys from DriverEntry -// driveIndex matches the index passed to IoRegisterDiskDevice. -__declspec(dllexport) KSTATUS IoRegisterFilesystem(uint8_t driveIndex, IO_FILESYSTEM* fs, const IO_VOLUME_PARAMS *vol); -__declspec(dllexport) KSTATUS IoUnregisterFilesystem(uint8_t driveIndex); -__declspec(dllexport) KSTATUS IoUnregisterFilesystemsForDisk(uint8_t diskIndex); -__declspec(dllexport) bool IoFilesystemPresent(uint8_t driveIndex); -__declspec(dllexport) void IoQueryFilesystemStats(IO_FILESYSTEM_STATS* out); - -// Kernel-side API. -__declspec(dllexport) KSTATUS IoOpenFile(SYS_STRING_VIEW path, FILE_OBJECT **out); -__declspec(dllexport) KSTATUS IoReadFile(FILE_OBJECT* file, void* buf, - size_t size, size_t* bytesRead); -__declspec(dllexport) KSTATUS IoReadFileAt(FILE_OBJECT* file, uint64_t offset, - void* buf, size_t size, size_t* bytesRead); -__declspec(dllexport) KSTATUS IoWriteFile (FILE_OBJECT* file, const void* buf, - size_t size, size_t* bytesWritten); -__declspec(dllexport) KSTATUS IoWriteFileAt(FILE_OBJECT* file, uint64_t offset, - const void* buf, size_t size, - size_t* bytesWritten); -__declspec(dllexport) KSTATUS IoFlushFile(FILE_OBJECT* file); -__declspec(dllexport) KSTATUS IoReadFileAsyncKernel(FILE_OBJECT* file, void* buf, - size_t size, uint64_t offset, IO_STATUS_BLOCK* iosb, - struct EVENT* completionEvent, struct KAPC* completionApc, - MM_LOCKED_USER_BUFFER* lockedBuffer, - MM_LOCKED_USER_BUFFER* lockedIosb, - IO_ASYNC_FILE_REQUEST_OBJECT** requestOut); -__declspec(dllexport) KSTATUS IoWriteFileAsyncKernel(FILE_OBJECT* file, const void* buf, - size_t size, uint64_t offset, IO_STATUS_BLOCK* iosb, - struct EVENT* completionEvent, struct KAPC* completionApc, - MM_LOCKED_USER_BUFFER* lockedBuffer, - MM_LOCKED_USER_BUFFER* lockedIosb, - IO_ASYNC_FILE_REQUEST_OBJECT** requestOut); -__declspec(dllexport) OBJECT* IoAsyncFileRequestObject(IO_ASYNC_FILE_REQUEST_OBJECT* request); -__declspec(dllexport) KSTATUS IoWaitAsyncFileRequest(IO_ASYNC_FILE_REQUEST_OBJECT* request, - uint32_t flags); +__declspec(dllexport) KSTATUS IoReadFileAsyncKernel(FILE_OBJECT* file, + void* buf, + size_t size, + uint64_t offset, + IO_STATUS_BLOCK* iosb, + struct EVENT* completionEvent, + struct KAPC* completionApc, + MM_LOCKED_USER_BUFFER* lockedBuffer, + MM_LOCKED_USER_BUFFER* lockedIosb, + IO_ASYNC_FILE_REQUEST_OBJECT** requestOut); +__declspec(dllexport) KSTATUS IoWriteFileAsyncKernel(FILE_OBJECT* file, + const void* buf, + size_t size, + uint64_t offset, + IO_STATUS_BLOCK* iosb, + struct EVENT* completionEvent, + struct KAPC* completionApc, + MM_LOCKED_USER_BUFFER* lockedBuffer, + MM_LOCKED_USER_BUFFER* lockedIosb, + IO_ASYNC_FILE_REQUEST_OBJECT** requestOut); +__declspec(dllexport) OBJECT* IoAsyncFileRequestObject(IO_ASYNC_FILE_REQUEST_OBJECT* request); +__declspec(dllexport) KSTATUS IoWaitAsyncFileRequest(IO_ASYNC_FILE_REQUEST_OBJECT* request, + uint32_t flags); __declspec(dllexport) struct EVENT* IoGetAsyncFileRequestWaitEvent(IO_ASYNC_FILE_REQUEST_OBJECT* request); -__declspec(dllexport) KSTATUS IoCancelAsyncFileRequest(IO_ASYNC_FILE_REQUEST_OBJECT* request); -__declspec(dllexport) KSTATUS IoQueryAsyncFileRequest(IO_ASYNC_FILE_REQUEST_OBJECT* request, - IO_STATUS_BLOCK* iosbOut); -__declspec(dllexport) KSTATUS IoCreateFile (SYS_STRING_VIEW path, FILE_OBJECT** out); -__declspec(dllexport) KSTATUS IoDeleteFile (SYS_STRING_VIEW path); -__declspec(dllexport) KSTATUS IoRenameFile (SYS_STRING_VIEW oldPath, SYS_STRING_VIEW newPath); -__declspec(dllexport) KSTATUS IoCreateDir (SYS_STRING_VIEW path); -__declspec(dllexport) KSTATUS IoRemoveDir (SYS_STRING_VIEW path); -__declspec(dllexport) KSTATUS IoTruncateFile(FILE_OBJECT* file, uint64_t newSize); -__declspec(dllexport) KSTATUS IoSeekFile(FILE_OBJECT* file, uint64_t offset); -__declspec(dllexport) uint64_t IoGetFileSize(FILE_OBJECT* file); -__declspec(dllexport) KSTATUS IoGetFileStat(FILE_OBJECT* file, SYS_FILE_STAT* out); -__declspec(dllexport) KSTATUS IoStatFile(SYS_STRING_VIEW path, SYS_FILE_STAT* out); -__declspec(dllexport) KSTATUS IoQueryFileIdentity(FILE_OBJECT* file, IO_FILE_IDENTITY* out); -__declspec(dllexport) KSTATUS IoLockFile(FILE_OBJECT* file, struct PROCESS* owner, uint32_t mode, uint64_t offset, uint64_t length, uint64_t timeoutMilliseconds); -__declspec(dllexport) KSTATUS IoUnlockFile(FILE_OBJECT* file, struct PROCESS* owner, uint64_t offset, uint64_t length); -__declspec(dllexport) void IoReleaseFileLocksForProcess(struct PROCESS* owner); -__declspec(dllexport) void IoCloseFile(FILE_OBJECT* file); +__declspec(dllexport) KSTATUS IoCancelAsyncFileRequest(IO_ASYNC_FILE_REQUEST_OBJECT* request); +__declspec(dllexport) KSTATUS IoQueryAsyncFileRequest(IO_ASYNC_FILE_REQUEST_OBJECT* request, + IO_STATUS_BLOCK* iosbOut); -// Directory enumeration API. -__declspec(dllexport) KSTATUS IoOpenDir (SYS_STRING_VIEW dirPath, DIR_OBJECT** out); -__declspec(dllexport) KSTATUS IoReadDir (DIR_OBJECT* dir, KDIR_ENTRY* entryOut); -__declspec(dllexport) void IoCloseDir(DIR_OBJECT* dir); - -// Current Working Directory. -__declspec(dllexport) KSTATUS IoSetCwd(SYS_STRING_VIEW path); -__declspec(dllexport) KSTATUS IoRealPath(SYS_STRING_VIEW path, char* buffer, size_t bufferSize, size_t* requiredSizeOut); +__declspec(dllexport) KSTATUS IoLockFile(FILE_OBJECT* file, + struct PROCESS* owner, + uint32_t mode, + uint64_t offset, + uint64_t length, + uint64_t timeoutMilliseconds); +__declspec(dllexport) KSTATUS IoUnlockFile(FILE_OBJECT* file, + struct PROCESS* owner, + uint64_t offset, + uint64_t length); +__declspec(dllexport) void IoReleaseFileLocksForProcess(struct PROCESS* owner); diff --git a/code/kernel/include/kernel/ke_debug.h b/code/kernel/include/kernel/ke_debug.h index 14ad813..a1f4447 100644 --- a/code/kernel/include/kernel/ke_debug.h +++ b/code/kernel/include/kernel/ke_debug.h @@ -8,6 +8,7 @@ #include #include #include +#include #define KE_DEBUG_CONSOLE 0x00000001u #define KE_DEBUG_SELFTEST 0x00000002u @@ -29,17 +30,6 @@ __declspec(dllexport) void DbgPrint(const char* fmt, ...); __declspec(dllexport) void KePrintConsole(const char* buf, size_t len); __declspec(dllexport) KSTATUS KeFlushDebugLogToFile(SYS_STRING_VIEW path); -typedef enum KE_PANIC_CODE { - KE_PANIC_CODE_GENERIC = 0, - KE_PANIC_CODE_FAULT = 1, - KE_PANIC_CODE_IRQL = 2, - KE_PANIC_CODE_SELFTEST = 3, - KE_PANIC_CODE_TRAP = 4, - KE_PANIC_CODE_DRIVER = 5, - KE_PANIC_CODE_INIT = 6, - KE_PANIC_CODE_SCHEDULER= 7, -} KE_PANIC_CODE; - __declspec(dllexport) _Noreturn void KePanic(int code, const char* fmt, ...); __declspec(dllexport) int KeHandleNmiIpi(void); diff --git a/code/kernel/include/kernel/ke_display.h b/code/kernel/include/kernel/ke_display.h index 86965ef..b668345 100644 --- a/code/kernel/include/kernel/ke_display.h +++ b/code/kernel/include/kernel/ke_display.h @@ -1,10 +1,6 @@ // Kernel ke display declarations shared by implementation files and kernel clients. #pragma once -#include -#include -#include -#include #include #ifndef DISPLAY_API @@ -14,50 +10,7 @@ #define DISPLAY_API __declspec(dllimport) #endif #endif -#include -typedef struct KE_CONSOLE_INFO { - uint32_t Columns; - uint32_t Rows; - uint32_t CursorX; - uint32_t CursorY; - uint16_t Attribute; -} KE_CONSOLE_INFO; - -typedef struct KE_DISPLAY_INFO { - char PrimaryName[32]; - DISPLAY_MODE Mode; - uint32_t Caps; - uint32_t DeviceCount; - DISPLAY_STATS ManagerStats; - DISPLAY_STATS DeviceStats; -} KE_DISPLAY_INFO; +#include void KeDisplayInitialize(const HAL_API* hal); - -DISPLAY_API KSTATUS KeDisplayRegisterDevice(DISPLAY_DEVICE* device); -DISPLAY_API KSTATUS KeDisplaySetPrimary(DISPLAY_DEVICE* device); -DISPLAY_API void KeDisplaySuspendConsole(bool suspend); - -DISPLAY_API KSTATUS KeDisplayGetMode(DISPLAY_MODE* outMode); -DISPLAY_API KSTATUS KeDisplayGetSize(int* outWidth, int* outHeight); -typedef KSTATUS (*KE_DISPLAY_ROW_SOURCE)(void* context, int rowIndex, uint32_t* scratch, size_t pixelCount); -DISPLAY_API KSTATUS KeDisplayBlit(int x, int y, int w, int h, const uint32_t* pixels); -DISPLAY_API KSTATUS KeDisplayBlitRows(int x, int y, int w, int h, KE_DISPLAY_ROW_SOURCE source, void* context, uint32_t* scratch); -DISPLAY_API KSTATUS KeDisplayFillRect(int x, int y, int w, int h, uint32_t color); -DISPLAY_API KSTATUS KeDisplayClear(uint32_t color); -DISPLAY_API KSTATUS KeDisplayCopyRect(int dstX, int dstY, int srcX, int srcY, int w, int h); -DISPLAY_API KSTATUS KeDisplayScroll(int lines); -DISPLAY_API KSTATUS KeDisplayPutChar(char c, int x, int y, uint32_t fg, uint32_t bg); -DISPLAY_API KSTATUS KeDisplayPrintChar(char c, uint32_t fg, uint32_t bg); -DISPLAY_API KSTATUS KeDisplayGetConsoleInfo(KE_CONSOLE_INFO* outInfo); -DISPLAY_API KSTATUS KeDisplaySetConsoleCursor(int col, int row); -DISPLAY_API KSTATUS KeDisplayFillConsoleChars(char c, int col, int row, size_t length, size_t* writtenOut); -DISPLAY_API KSTATUS KeDisplayFillConsoleAttrs(uint16_t attr, int col, int row, size_t length, size_t* writtenOut); -DISPLAY_API KSTATUS KeDisplayPresent(const DISPLAY_RECT* rects, size_t rectCount); -DISPLAY_API KSTATUS KeDisplaySync(void); -DISPLAY_API KSTATUS KeDisplayQueryInfo(KE_DISPLAY_INFO* outInfo); - -DISPLAY_API KSTATUS KeDisplaySetCursorImage(int width, int height, int hotX, int hotY, const uint32_t* argbPixels); -DISPLAY_API KSTATUS KeDisplaySetCursorPosition(int x, int y); -DISPLAY_API KSTATUS KeDisplayShowCursor(bool show); diff --git a/code/kernel/include/kernel/ke_dpc.h b/code/kernel/include/kernel/ke_dpc.h index 76ccf3c..4a2d3a6 100644 --- a/code/kernel/include/kernel/ke_dpc.h +++ b/code/kernel/include/kernel/ke_dpc.h @@ -1,46 +1,16 @@ // Kernel ke dpc declarations shared by implementation files and kernel clients. #pragma once -// ke_dpc.h - deferred procedure calls - +// ke_dpc.h - deferred procedure calls. // DPCs are the kernel's bottom-half mechanism. Hardware ISRs can queue a DPC // after acknowledging/capturing device state; the DPC then runs later at -// DISPATCH_LEVEL from the common interrupt-exit path. DPC routines must not -// wait, block, or call PASSIVE_LEVEL-only code. +// DISPATCH_LEVEL from the common interrupt-exit path. The legacy storage layout +// is DDK-visible while kernel-mode drivers are being moved behind the real DDK. -#include -#include -#include -#include - -typedef struct KDPC KDPC; - -typedef void (*KDEFERRED_ROUTINE)(KDPC* dpc, - void* context, - void* systemArgument1, - void* systemArgument2); - -struct KDPC { - LIST_ENTRY Link; - KDEFERRED_ROUTINE Routine; - void* Context; - void* SystemArgument1; - void* SystemArgument2; - volatile long Inserted; -}; +#include // Called during kernel bring-up before interrupts are enabled. void KeInitializeDpcSystem(void); -__declspec(dllexport) void KeInitializeDpc(KDPC* dpc, - KDEFERRED_ROUTINE routine, - void* context); - -// Queue a DPC if it is not already queued. Returns false if the DPC was -// already pending or the arguments are invalid. -__declspec(dllexport) bool KeInsertQueueDpc(KDPC* dpc, - void* systemArgument1, - void* systemArgument2); - // Internal: drain queued DPCs at DISPATCH_LEVEL. Called from interrupt exit. void KiDrainDpcQueue(void); diff --git a/code/kernel/include/kernel/ke_event.h b/code/kernel/include/kernel/ke_event.h index 9577a92..e3b86de 100644 --- a/code/kernel/include/kernel/ke_event.h +++ b/code/kernel/include/kernel/ke_event.h @@ -2,26 +2,7 @@ #pragma once // ke_event.h - auto-reset and manual-reset events. -#include -#include -#include -#include -#include +// Event layout is DDK-visible during the legacy driver cleanup. This private +// header intentionally reuses the shared declaration instead of redefining it. -typedef enum EVENT_TYPE { EventAutoReset, EventManualReset } EVENT_TYPE; - -typedef struct EVENT { - OBJECT Header; - SPINLOCK Lock; - EVENT_TYPE Type; - uint32_t Signaled; - LIST_ENTRY WaitList; - LIST_ENTRY MultiWaitList; -} EVENT; - -__declspec(dllexport) KSTATUS KeEventCreate(EVENT_TYPE type, uint32_t initialState, EVENT **out); -__declspec(dllexport) void KeSignalEvent(EVENT* event); -__declspec(dllexport) void KeClearEvent(EVENT* event); -__declspec(dllexport) KSTATUS KeWaitForEvent(EVENT* event, uint8_t alertable); -__declspec(dllexport) KSTATUS KeTryWaitEvent(EVENT* event); -__declspec(dllexport) KSTATUS KeWaitForMultipleEvents(EVENT** events, uint32_t count, uint8_t alertable, uint64_t timeoutMs, uint32_t* signaledIndexOut); +#include diff --git a/code/kernel/include/kernel/ke_irp.h b/code/kernel/include/kernel/ke_irp.h index af254e3..67d71dd 100644 --- a/code/kernel/include/kernel/ke_irp.h +++ b/code/kernel/include/kernel/ke_irp.h @@ -1,200 +1,8 @@ // Kernel ke irp declarations shared by implementation files and kernel clients. #pragma once -// ke_irp.h - I/O Request Packet and remove-lock primitives -// IRPs are stack-based. A caller builds an IRP with one or more -// IO_STACK_LOCATION entries, submits it to a DEVICE_OBJECT, and the I/O -// manager/driver stack advances CurrentLocation as the IRP is forwarded. +// ke_irp.h - kernel-private include path for the current IRP API. +// The legacy layout is DDK-visible until the opaque IRP accessor work lands. -#include -#include -#include -#include -#include -#include -#include - -struct EVENT; -struct SEMAPHORE; -struct KAPC; -typedef struct DEVICE_OBJECT DEVICE_OBJECT; - -// IRP major/minor functions. - -typedef enum IO_MAJOR_FUNCTION { - IRP_MJ_CREATE = 0, - IRP_MJ_CLOSE = 1, - IRP_MJ_READ = 2, - IRP_MJ_WRITE = 3, - IRP_MJ_DEVICE_CONTROL = 4, - IRP_MJ_INTERNAL_DEVICE_CONTROL = 5, - IRP_MJ_PNP = 6, - IRP_MJ_POWER = 7, - IRP_MJ_MAXIMUM_FUNCTION = 8, -} IO_MAJOR_FUNCTION; - -typedef enum IO_PNP_MINOR_FUNCTION { - IRP_MN_START_DEVICE = 0, - IRP_MN_QUERY_REMOVE_DEVICE = 1, - IRP_MN_CANCEL_REMOVE_DEVICE = 2, - IRP_MN_SURPRISE_REMOVAL = 3, - IRP_MN_REMOVE_DEVICE = 4, - IRP_MN_QUERY_DEVICE_RELATIONS = 5, - IRP_MN_QUERY_ID = 6, - IRP_MN_QUERY_CAPABILITIES = 7, -} IO_PNP_MINOR_FUNCTION; - -typedef enum IO_DEVICE_RELATION_TYPE { - IoBusRelations = 0, - IoRemovalRelations = 1, -} IO_DEVICE_RELATION_TYPE; - -// IRP flags. - -#define IRP_FLAG_PRIORITY (1u << 0) // insert at head of a driver queue -#define IRP_FLAG_CANCELLED (1u << 1) -#define IRP_FLAG_COMPLETED (1u << 2) - -// IRP stack parameters. - -typedef struct IO_STACK_LOCATION { - IO_MAJOR_FUNCTION MajorFunction; - uint8_t MinorFunction; - DEVICE_OBJECT* DeviceObject; - - union { - struct { - uint64_t ByteOffset; - uint32_t Length; - } ReadWrite; - - struct { - uint32_t IoControlCode; - void* InputBuffer; - uint32_t InputLength; - void* OutputBuffer; - uint32_t OutputLength; - } DeviceIoControl; - - struct { - IO_DEVICE_RELATION_TYPE RelationType; - } QueryDeviceRelations; - - struct { - uint32_t IdType; - } QueryId; - } Parameters; -} IO_STACK_LOCATION; - -// Forward declaration / callbacks. - -typedef struct IRP IRP; - -typedef void (*IRP_COMPLETION_FN)(IRP* irp, void* ctx); -typedef void (*IRP_CANCEL_ROUTINE)(DEVICE_OBJECT* device, IRP* irp); - -// I/O Request Packet. - -typedef struct IRP { - LIST_ENTRY Link; - - volatile KSTATUS Status; - volatile size_t Information; - - uint32_t Flags; - volatile bool Cancel; - SPINLOCK CancelLock; - KIRQL CancelIrql; - IRP_CANCEL_ROUTINE CancelRoutine; - - struct EVENT* CompletionEvent; - struct KAPC* CompletionApc; - IRP_COMPLETION_FN CompletionFn; - void* CompletionCtx; - - void* UserBuffer; - void* SystemBuffer; - - uint8_t StackCount; - uint8_t CurrentLocation; - - // Driver-owned scratch fields. They are deliberately not interpreted by - // the I/O manager and are preserved across queueing/completion. - uint8_t HwSlot; - void* DriverCtx; - - IO_STACK_LOCATION Stack[1]; -} IRP; - -// Remove lock. - -typedef struct IO_REMOVE_LOCK { - SPINLOCK Lock; - volatile long IoCount; - bool Removing; - struct EVENT* RemovedEvent; -} IO_REMOVE_LOCK; - -__declspec(dllexport) KSTATUS IoInitializeRemoveLock(IO_REMOVE_LOCK* lock); -__declspec(dllexport) void IoDestroyRemoveLock(IO_REMOVE_LOCK* lock); -__declspec(dllexport) KSTATUS IoAcquireRemoveLock(IO_REMOVE_LOCK* lock, IRP* irp); -__declspec(dllexport) void IoReleaseRemoveLock(IO_REMOVE_LOCK* lock, IRP* irp); -__declspec(dllexport) void IoReleaseRemoveLockAndWait(IO_REMOVE_LOCK* lock, IRP* removeIrp); - -// IRP_QUEUE (per-device, driver-internal). - -typedef struct IRP_QUEUE { - SPINLOCK Lock; - LIST_ENTRY Head; - struct SEMAPHORE* Semaphore; -} IRP_QUEUE; - -__declspec(dllexport) void IrpQueueInit (IRP_QUEUE* q, struct SEMAPHORE* sem); -__declspec(dllexport) void IrpQueueEnqueue (IRP_QUEUE* q, IRP* irp); -__declspec(dllexport) IRP* IrpQueueDequeue (IRP_QUEUE* q); -typedef void (*IRP_QUEUE_CANCEL_CALLBACK)(IRP* irp, void* context); -__declspec(dllexport) void IrpQueueCancelAllEx(IRP_QUEUE* q, - KSTATUS status, - IRP_QUEUE_CANCEL_CALLBACK callback, - void* context); -__declspec(dllexport) void IrpQueueCancelAll(IRP_QUEUE* q, KSTATUS status); - -// IRP allocation / stack helpers. - -__declspec(dllexport) KSTATUS IoAllocateIrp(uint8_t stackCount, IRP** outIrp); -__declspec(dllexport) void IoFreeIrp(IRP* irp); -__declspec(dllexport) void IoInitializeIrp(IRP* irp, uint8_t stackCount); - -__declspec(dllexport) IO_STACK_LOCATION* IoGetCurrentIrpStackLocation(IRP* irp); -__declspec(dllexport) IO_STACK_LOCATION* IoGetNextIrpStackLocation(IRP* irp); -__declspec(dllexport) void IoSkipCurrentIrpStackLocation(IRP* irp); -__declspec(dllexport) void IoCopyCurrentIrpStackLocationToNext(IRP* irp); -__declspec(dllexport) void IoSetCompletionRoutine(IRP* irp, IRP_COMPLETION_FN fn, void* ctx); -__declspec(dllexport) IRP_CANCEL_ROUTINE IoSetCancelRoutine(IRP* irp, IRP_CANCEL_ROUTINE routine); -__declspec(dllexport) void IoCancelIrp(IRP* irp); - -__declspec(dllexport) void IoBuildReadWriteIrp(IRP* irp, - IO_MAJOR_FUNCTION major, - uint64_t byteOffset, - uint32_t length, - void* buffer); -__declspec(dllexport) void IoBuildPnpIrp(IRP* irp, - IO_PNP_MINOR_FUNCTION minor); -__declspec(dllexport) void IoBuildDeviceIoControlIrp(IRP* irp, - IO_MAJOR_FUNCTION major, - uint32_t ioControlCode, - void* inputBuffer, - uint32_t inputLength, - void* outputBuffer, - uint32_t outputLength); - -// Complete an IRP exactly once: publish status/information, signal the -// optional completion event, queue the optional APC, then invoke the optional -// completion callback. -__declspec(dllexport) KSTATUS IoCompleteRequest(IRP* irp, KSTATUS status, size_t information); - -// Submit to a specific top-of-stack device object. The current stack location -// is stamped with the target device before dispatch. -__declspec(dllexport) KSTATUS IoSubmitIrp(DEVICE_OBJECT* device, IRP* irp); -__declspec(dllexport) KSTATUS IoSubmitIrpSync(DEVICE_OBJECT* device, IRP* irp); +#include diff --git a/code/kernel/include/kernel/ke_irql.h b/code/kernel/include/kernel/ke_irql.h index cf817d4..58961a5 100644 --- a/code/kernel/include/kernel/ke_irql.h +++ b/code/kernel/include/kernel/ke_irql.h @@ -1,36 +1,30 @@ // Kernel ke irql declarations shared by implementation files and kernel clients. #pragma once -// ke_irql.h - software IRQL skeleton -// This is intentionally small for the first IRQL/APC bring-up step. It does -// not yet program interrupt hardware or replace the spinlock interrupt-disable -// path. It gives the kernel one authoritative execution-level state plus -// assertions so blocking code can reject illegal callers early. +// ke_irql.h - software IRQL skeleton. +// The level constants are DDK-visible because current synchronization and IRP +// layouts expose KIRQL. Kernel routines remain declared here. -#include - -typedef uint8_t KIRQL; - -#define PASSIVE_LEVEL ((KIRQL)0) -#define APC_LEVEL ((KIRQL)1) -#define DISPATCH_LEVEL ((KIRQL)2) -#define DIRQL_BASE ((KIRQL)16) -#define HIGH_LEVEL ((KIRQL)31) +#include +// Return the current processor's software IRQL. __declspec(dllexport) KIRQL KeGetCurrentIrql(void); -// Raise to newIrql and return the previous level. Raising to a lower level is -// a kernel bug and will panic in checked/debug-style builds. +// Raise to newIrql and return the previous level. __declspec(dllexport) KIRQL KeRaiseIrql(KIRQL newIrql); -// Restore a previously returned level. Lowering to a higher level is a kernel -// bug and will panic. +// Restore a previously returned level. __declspec(dllexport) void KeLowerIrql(KIRQL oldIrql); +// Assert that the current IRQL exactly matches expected. __declspec(dllexport) void KeAssertIrql(KIRQL expected); -__declspec(dllexport) void KeAssertIrqlAtOrBelow(KIRQL maxIrql); -__declspec(dllexport) int KeCanWait(void); -// Internal/debug helper used by diagnostics and panic messages. +// Assert that the current IRQL is at or below maxIrql. +__declspec(dllexport) void KeAssertIrqlAtOrBelow(KIRQL maxIrql); + +// Return nonzero when the current context may block. +__declspec(dllexport) int KeCanWait(void); + +// Return a diagnostic name for an IRQL. __declspec(dllexport) const char* KeIrqlName(KIRQL irql); diff --git a/code/kernel/include/kernel/ke_list.h b/code/kernel/include/kernel/ke_list.h index d0fc80d..871f8be 100644 --- a/code/kernel/include/kernel/ke_list.h +++ b/code/kernel/include/kernel/ke_list.h @@ -1,49 +1,9 @@ // Kernel ke list declarations shared by implementation files and kernel clients. #pragma once -// ke_list.h - intrusive doubly-linked list -// Used throughout the kernel for run queues, wait lists, thread lists, etc. -#include -typedef struct LIST_ENTRY { - struct LIST_ENTRY* Fwd; - struct LIST_ENTRY* Bwd; -} LIST_ENTRY; +// ke_list.h - kernel-private include path for the shared intrusive list type. +// The type currently remains DDK-visible because legacy driver objects still +// expose embedded lists and IRPs. Opaque request/device work removes that need. -#define LIST_INIT(head) ((head)->Fwd = (head)->Bwd = (head)) -#define LIST_IS_EMPTY(head) ((head)->Fwd == (head)) - -// Recover the containing struct pointer from an embedded LIST_ENTRY. -#define CONTAINING_RECORD(ptr, type, member) \ - ((type *)((char *)(ptr) - offsetof(type, member))) - -// Implements the list Insert Tail operation. -static inline void ListInsertTail(LIST_ENTRY* head, LIST_ENTRY* node) { - node->Bwd = head->Bwd; - node->Fwd = head; - head->Bwd->Fwd = node; - head->Bwd = node; -} - -// Implements the list Insert Head operation. -static inline void ListInsertHead(LIST_ENTRY* head, LIST_ENTRY* node) { - node->Fwd = head->Fwd; - node->Bwd = head; - head->Fwd->Bwd = node; - head->Fwd = node; -} - -// Implements the list Remove operation. -static inline void ListRemove(LIST_ENTRY* node) { - node->Bwd->Fwd = node->Fwd; - node->Fwd->Bwd = node->Bwd; - node->Fwd = node->Bwd = node; // self-loop: poison against double-remove -} - -// Pop the first entry off the list, or NULL if empty. -static inline LIST_ENTRY* ListPopHead(LIST_ENTRY* head) { - if (LIST_IS_EMPTY(head)) return (LIST_ENTRY *)0; - LIST_ENTRY* node = head->Fwd; - ListRemove(node); - return node; -} +#include diff --git a/code/kernel/include/kernel/ke_spinlock.h b/code/kernel/include/kernel/ke_spinlock.h index dac93b4..19cc0dc 100644 --- a/code/kernel/include/kernel/ke_spinlock.h +++ b/code/kernel/include/kernel/ke_spinlock.h @@ -1,95 +1,8 @@ // Kernel ke spinlock declarations shared by implementation files and kernel clients. #pragma once -// ke_spinlock.h - spinlock for short, non-sleeping critical sections -// Step 3 IRQL bring-up: -// * Acquiring a spinlock disables maskable interrupts and raises the software -// IRQL to at least DISPATCH_LEVEL. -// * Releasing restores both the previous IRQL and the previous RFLAGS.IF -// state through the returned cookie. - -// The public type remains uintptr_t so existing callers do not need to change. -// Never hold a spinlock across a wait/blocking operation. -#include -#include -#include -#include - -typedef struct SPINLOCK { - volatile long Locked; -} SPINLOCK; - -#define SPINLOCK_INIT { 0 } - -#define KI_SPINLOCK_IRQL_SHIFT ((unsigned)(sizeof(uintptr_t) * 8u - 8u)) -#define KI_SPINLOCK_FLAGS_MASK (~(((uintptr_t)0xFFu) << KI_SPINLOCK_IRQL_SHIFT)) - -// Implements the pack Spinlock Cookie operation. -static __forceinline uintptr_t KiPackSpinlockCookie(uintptr_t flags, KIRQL oldIrql) { - return (flags & KI_SPINLOCK_FLAGS_MASK) | - (((uintptr_t)oldIrql) << KI_SPINLOCK_IRQL_SHIFT); -} - -// Implements the spinlock Cookie Flags operation. -static __forceinline uintptr_t KiSpinlockCookieFlags(uintptr_t cookie) { - return cookie & KI_SPINLOCK_FLAGS_MASK; -} - -// Implements the spinlock Cookie Irql operation. -static __forceinline KIRQL KiSpinlockCookieIrql(uintptr_t cookie) { - return (KIRQL)(cookie >> KI_SPINLOCK_IRQL_SHIFT); -} - -// Save RFLAGS, mask interrupts, raise to DISPATCH_LEVEL if needed, acquire. -// If already running at DIRQL, the higher IRQL is preserved. -static __forceinline uintptr_t KeAcquireSpinlock(SPINLOCK* sl) { - uintptr_t flags = HalDisableInterrupts(); - - KIRQL oldIrql = KeGetCurrentIrql(); - if (oldIrql < DISPATCH_LEVEL) - KeRaiseIrql(DISPATCH_LEVEL); - - while (_InterlockedCompareExchange(&sl->Locked, 1, 0) != 0) - _mm_pause(); - - return KiPackSpinlockCookie(flags, oldIrql); -} - -// Release and restore the caller's previous software IRQL/RFLAGS state. -static __forceinline void KeReleaseSpinlock(SPINLOCK* sl, uintptr_t cookie) { - uintptr_t flags = KiSpinlockCookieFlags(cookie); - KIRQL oldIrql = KiSpinlockCookieIrql(cookie); - - _InterlockedExchange(&sl->Locked, 0); - KeLowerIrql(oldIrql); - HalRestoreInterrupts(flags); -} - -// Implements the try Acquire Spinlock operation. -static __forceinline int KeTryAcquireSpinlock(SPINLOCK* sl, uintptr_t* outCookie) { - uintptr_t flags = HalDisableInterrupts(); - - KIRQL oldIrql = KeGetCurrentIrql(); - if (oldIrql < DISPATCH_LEVEL) - KeRaiseIrql(DISPATCH_LEVEL); - - if (_InterlockedCompareExchange(&sl->Locked, 1, 0) == 0) { - *outCookie = KiPackSpinlockCookie(flags, oldIrql); - return 1; - } - - KeLowerIrql(oldIrql); - HalRestoreInterrupts(flags); - return 0; -} - -// Transitional names for the IRQL-aware driver model work that follows. -static __forceinline uintptr_t KeAcquireSpinlockRaiseToDpc(SPINLOCK* sl) { - return KeAcquireSpinlock(sl); -} - -// Releases spinlock From Dpc. -static __forceinline void KeReleaseSpinlockFromDpc(SPINLOCK* sl, uintptr_t cookie) { - KeReleaseSpinlock(sl, cookie); -} +// The current spinlock layout and inline operations are DDK-visible while +// driver objects still embed spinlocks. The kernel-private header remains as a +// compatibility include for kernel implementation files only. +#include diff --git a/code/kernel/include/kernel/ke_thread.h b/code/kernel/include/kernel/ke_thread.h index d44ccb7..6f6e397 100644 --- a/code/kernel/include/kernel/ke_thread.h +++ b/code/kernel/include/kernel/ke_thread.h @@ -1,6 +1,8 @@ // Kernel ke thread declarations shared by implementation files and kernel clients. #pragma once + +#include // ke_thread.h - thread model // A THREAD is the unit of scheduling. Every thread belongs to exactly one process. #include @@ -17,12 +19,15 @@ typedef struct THREAD THREAD; +#ifndef NTL_THREAD_PRIORITY_DEFINED typedef enum THREAD_PRIORITY { PriorityLow = 0, PriorityNormal = 1, PriorityHigh = 2, PriorityCount = 3, } THREAD_PRIORITY; +#define NTL_THREAD_PRIORITY_DEFINED 1 +#endif typedef enum THREAD_STATE { ThreadReady = 0, diff --git a/code/kernel/include/kernel/mm_pfn.h b/code/kernel/include/kernel/mm_pfn.h index acbccc1..1ee0843 100644 --- a/code/kernel/include/kernel/mm_pfn.h +++ b/code/kernel/include/kernel/mm_pfn.h @@ -5,6 +5,8 @@ #pragma once +#include + #include #include #include @@ -12,6 +14,7 @@ #define MM_PFN_INVALID_INDEX ((size_t)-1) +#ifndef NTL_MM_PFN_TYPES_DEFINED typedef enum MM_PFN_STATE { MmPfnStateInvalid = 0, MmPfnStateReserved, @@ -51,6 +54,9 @@ typedef struct MM_PFN { uint64_t BackingPage; } MM_PFN; +#define NTL_MM_PFN_TYPES_DEFINED 1 +#endif + typedef struct MM_PFN_STATS { uint64_t TotalFrames; uint64_t FreeFrames; diff --git a/code/kernel/include/kernel/mm_phys.h b/code/kernel/include/kernel/mm_phys.h index cc44ff8..688a378 100644 --- a/code/kernel/include/kernel/mm_phys.h +++ b/code/kernel/include/kernel/mm_phys.h @@ -4,15 +4,24 @@ #pragma once +#include + #include #include #include #include +#ifndef PAGE_SIZE #define PAGE_SIZE 4096ULL +#endif +#ifndef PAGE_MASK #define PAGE_MASK (~(PAGE_SIZE - 1)) +#endif +#ifndef NTL_PHYSICAL_ADDRESS_DEFINED typedef uint64_t PHYSICAL_ADDRESS; +#define NTL_PHYSICAL_ADDRESS_DEFINED 1 +#endif typedef struct MM_PHYSICAL_STATS { uint64_t TotalFrames; diff --git a/code/kernel/include/kernel/mm_pte.h b/code/kernel/include/kernel/mm_pte.h index 8b04aca..6ef7520 100644 --- a/code/kernel/include/kernel/mm_pte.h +++ b/code/kernel/include/kernel/mm_pte.h @@ -1,6 +1,8 @@ // Kernel page-table manager declarations shared by the VMM and low-level kernel clients. #pragma once +#include + #include #include #include @@ -10,7 +12,9 @@ #define PAGE_PRESENT (1ULL << 0) #define PAGE_WRITE (1ULL << 1) #define PAGE_USER (1ULL << 2) +#ifndef PAGE_WRITETHROUGH #define PAGE_WRITETHROUGH (1ULL << 3) +#endif #define PAGE_NOCACHE (1ULL << 4) #define PAGE_ACCESSED (1ULL << 5) #define PAGE_DIRTY (1ULL << 6) @@ -57,10 +61,13 @@ typedef struct MM_PTE_STATS { uint64_t CurrentLeafMappings; } MM_PTE_STATS; +#ifndef NTL_MM_PTE_MAP_MODE_DEFINED typedef enum MM_PTE_MAP_MODE { MmPteMapFailIfPresent = 0, MmPteMapReplaceExisting = 1, } MM_PTE_MAP_MODE; +#define NTL_MM_PTE_MAP_MODE_DEFINED 1 +#endif // Initializes the page-table manager around the bootloader-created PML4. void MmPteInitialize(PHYSICAL_ADDRESS bootPml4Phys); diff --git a/code/kernel/include/kernel/ob_object.h b/code/kernel/include/kernel/ob_object.h index 09b5e1e..a490d08 100644 --- a/code/kernel/include/kernel/ob_object.h +++ b/code/kernel/include/kernel/ob_object.h @@ -1,48 +1,21 @@ // Kernel ob object declarations shared by implementation files and kernel clients. #pragma once -// ob_object.h - executive object model -// Every resource the kernel tracks is a typed, reference-counted OBJECT. -// The OBJECT header must be the first member of any derived struct. -#include + +// ob_object.h - executive object model. +// Every resource the kernel tracks is a typed, reference-counted OBJECT. The +// legacy OBJECT layout lives in the DDK while driver/device objects are still +// public; object-manager routines remain kernel-private. + #include #include - -typedef enum OBJECT_TYPE { - ObjectTypeProcess = 1, - ObjectTypeThread = 2, - ObjectTypeMutex = 3, - ObjectTypeSemaphore = 4, - ObjectTypeEvent = 5, - ObjectTypeQueue = 6, - ObjectTypeFile = 7, - ObjectTypeDir = 8, - ObjectTypeAsyncIo = 9, - ObjectTypeSocket = 10, - ObjectTypeDevice = 11, - ObjectTypeDriver = 12, - ObjectTypeUsbDevice = 13, - ObjectTypeUsbPipe = 14, - ObjectTypeFileMapping = 15, - ObjectTypeSurface = 16, - ObjectTypeInputQueue = 17, - ObjectTypeImageSection = 18, - ObjectTypeTimer = 19, - ObjectTypeModule = 20, -} OBJECT_TYPE; - -typedef struct OBJECT { - OBJECT_TYPE Type; - volatile long RefCount; // interlocked - void (*Destroy)(struct OBJECT* self); -} OBJECT; +#include // Increment the reference count. Call whenever ownership is shared. -__declspec(dllexport) void ObReferenceObject(OBJECT* object); +__declspec(dllexport) void ObReferenceObject(OBJECT* object); -// Decrement. Calls Destroy() and frees the object when count reaches zero. -__declspec(dllexport) void ObDereferenceObject(OBJECT* object); +// Decrement the reference count and destroy the object when it reaches zero. +__declspec(dllexport) void ObDereferenceObject(OBJECT* object); // Allocate a zeroed object of the given size from kernel pool. -// Caller must fill Type and Destroy before publishing the pointer. __declspec(dllexport) OBJECT* ObAllocateObject(OBJECT_TYPE type, size_t size); diff --git a/code/kernel/io_ddk.c b/code/kernel/io_ddk.c new file mode 100644 index 0000000..595abc9 --- /dev/null +++ b/code/kernel/io_ddk.c @@ -0,0 +1,119 @@ +// Kernel DDK-table provider implementation. + +#include +#include +#include +#include +#include +#include +#include + +static const HAL_API* gIoDdkHal; + +// Returns the kernel direct-map alias for a physical address. +static void* IoDdkPhysToVirt(uint64_t physicalAddress) { + if (!gIoDdkHal || !gIoDdkHal->PhysToVirt) + return (void*)0; + return gIoDdkHal->PhysToVirt(physicalAddress); +} + +// Maps one kernel page through the DDK memory surface. +static KSTATUS IoDdkMapPage(uintptr_t virtualAddress, + uint64_t physicalAddress, + uint64_t pageFlags, + NTL_DDK_MAP_MODE mode) { + MM_PTE_MAP_MODE kernelMode = MmPteMapFailIfPresent; + if (mode == NtlDdkMapReplaceExisting) + kernelMode = MmPteMapReplaceExisting; + return MmPteMapPage(virtualAddress, physicalAddress, pageFlags, kernelMode); +} + +// Reads one aligned PCI configuration DWORD through the platform HAL. +static uint32_t IoDdkPciRead32(uint16_t segment, + uint8_t bus, + uint8_t device, + uint8_t function, + uint16_t offset) { + if (!gIoDdkHal || !gIoDdkHal->Pci.Read32) + return 0xFFFFFFFFu; + return gIoDdkHal->Pci.Read32(segment, bus, device, function, offset); +} + +// Writes one aligned PCI configuration DWORD through the platform HAL. +static void IoDdkPciWrite32(uint16_t segment, + uint8_t bus, + uint8_t device, + uint8_t function, + uint16_t offset, + uint32_t value) { + if (!gIoDdkHal || !gIoDdkHal->Pci.Write32) + return; + gIoDdkHal->Pci.Write32(segment, bus, device, function, offset, value); +} + +// Returns the BSP local APIC identifier. +static uint32_t IoDdkGetBspLapicId(void) { + return HalGetBspLapicId(); +} + +// Returns whether the platform interrupt controller is using x2APIC mode. +static uint8_t IoDdkIsX2ApicEnabled(void) { + return HalApicUsingX2Apic(); +} + +// Allocates one kernel IRQ slot for MSI delivery. +static KSTATUS IoDdkAllocateMsiVector(uint8_t* outIrq) { + return KeIrqAllocateMsiVector(outIrq); +} + +static const NTL_DDK_DEBUG gIoDdkDebug = { + .Print = DbgPrint, +}; + +static const NTL_DDK_INTERRUPT gIoDdkInterrupt = { + .AllocateMsiVector = IoDdkAllocateMsiVector, +}; + +static const NTL_DDK_MEMORY gIoDdkMemory = { + .PhysToVirt = IoDdkPhysToVirt, + .MapPage = IoDdkMapPage, +}; + +static const NTL_DDK_PLATFORM gIoDdkPlatform = { + .PciRead32 = IoDdkPciRead32, + .PciWrite32 = IoDdkPciWrite32, + .GetBspLapicId = IoDdkGetBspLapicId, + .IsX2ApicEnabled = IoDdkIsX2ApicEnabled, +}; + +static const NTL_DDK_SCHEDULER gIoDdkScheduler = { + .DelayThread = KeDelayThread, + .Yield = KeYield, +}; + +static NTL_DDK_TIMER gIoDdkTimer = { + .QueryTicks = 0, + .Stall = 0, +}; + +static NTL_DDK gIoDdk = { + .Version = NTL_DDK_VERSION, + .Debug = &gIoDdkDebug, + .Interrupt = &gIoDdkInterrupt, + .Memory = &gIoDdkMemory, + .Platform = &gIoDdkPlatform, + .Scheduler = &gIoDdkScheduler, + .Timer = &gIoDdkTimer, +}; + +// Initializes the kernel-owned DDK table from platform services. +void IoInitializeDdk(const HAL_API* hal) { + gIoDdkHal = hal; + gIoDdkTimer.QueryTicks = hal ? hal->Timer.QueryTicks : 0; + gIoDdkTimer.Stall = hal ? hal->Timer.Stall : 0; +} + +// Returns the kernel-owned DDK table passed to driver entrypoints. +const NTL_DDK* IoGetDdk(void) { + return &gIoDdk; +} diff --git a/code/kernel/kmain.c b/code/kernel/kmain.c index f36f1f8..ed11472 100644 --- a/code/kernel/kmain.c +++ b/code/kernel/kmain.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -122,7 +123,7 @@ static void KiInitializeSwapFromSettings(void) { } } -typedef KSTATUS (*DRIVER_ENTRY_FN)(const HAL_API *); +typedef KSTATUS (*DRIVER_ENTRY_FN)(const NTL_DDK* ddk, NTL_DRIVER_INIT* init); // HAL pointer cached at boot for subsystems that still need platform services. static const HAL_API* gKmainHal; @@ -190,6 +191,8 @@ static void KiDriversIniCb(const char* section, const char* key, // Initializes drivers. static void KiInitializeDrivers(BOOT_INFO* bootInfo, const HAL_API* hal) { + (void)hal; + const NTL_DDK* ddk = IoGetDdk(); DbgPrint("KiInitializeDrivers: Initializing drivers...\n"); // boot drivers (provided by the bootloader). @@ -230,7 +233,8 @@ static void KiInitializeDrivers(BOOT_INFO* bootInfo, const HAL_API* hal) { // Execute Entry Point. DRIVER_ENTRY_FN entry = (DRIVER_ENTRY_FN)LdrGetEntryPoint(mappedBase); if (entry) { - KSTATUS ds = entry(hal); + NTL_DRIVER_INIT init = {0}; + KSTATUS ds = entry(ddk, &init); if (!KSUCCESS(ds)) { DbgPrint("WARNING: Driver %s returned failure status 0x%X\n", mod->Name, ds); } @@ -326,7 +330,8 @@ static void KiInitializeDrivers(BOOT_INFO* bootInfo, const HAL_API* hal) { DRIVER_ENTRY_FN entry = (DRIVER_ENTRY_FN)(LdrGetEntryPoint(mappedBase)); - KSTATUS ds = entry(hal); + NTL_DRIVER_INIT init = {0}; + KSTATUS ds = entry(ddk, &init); if (!KSUCCESS(ds)) { DbgPrint("KiInitializeDrivers: Driver %s failed to init!\n", runtimeKeys[i]); } @@ -523,6 +528,7 @@ extern void KernelMain(BOOT_INFO* bootInfo) { HalStopProcessor(); const HAL_API* hal = HalGetApi(); + IoInitializeDdk(hal); gKmainHal = hal; KeInitDebug(hal, bootInfo->Debug); diff --git a/code/public/ntlite/ddi/io_driver.h b/code/public/ntlite/ddi/io_driver.h index e04a951..ec5a7b5 100644 --- a/code/public/ntlite/ddi/io_driver.h +++ b/code/public/ntlite/ddi/io_driver.h @@ -1,7 +1,7 @@ -// Public NTLite io driver ABI declarations shared between kernel, drivers, and user mode. +// Public nt-lite legacy I/O driver declarations. #pragma once -// io_driver.h - kernel driver/device I/O model +// io_driver.h - legacy kernel driver/device I/O model. // Device lifetime is owned by the I/O manager. Bus drivers create PDOs, // function/filter drivers attach FDOs, and PnP/remove IRPs tear stacks down. @@ -12,13 +12,9 @@ #include #include #include -#include -#include -#include -#include - -typedef struct HAL_API HAL_API; -typedef KSTATUS (*DRIVER_ENTRY_FN)(const HAL_API* hal); +#include +#include +#include typedef void (*DRIVER_UNLOAD_FN)(void); typedef struct DRIVER_OBJECT DRIVER_OBJECT; diff --git a/code/public/ntlite/ddk/async.h b/code/public/ntlite/ddk/async.h new file mode 100644 index 0000000..b927a1d --- /dev/null +++ b/code/public/ntlite/ddk/async.h @@ -0,0 +1,52 @@ +// Public nt-lite DDK asynchronous request declarations. + +#pragma once + +#include +#include +#include +#include +#include + +struct EVENT; +struct KAPC; +struct IRP; +typedef struct MM_LOCKED_USER_BUFFER MM_LOCKED_USER_BUFFER; + +typedef struct IO_STATUS_BLOCK { + volatile KSTATUS Status; + volatile size_t Information; +} IO_STATUS_BLOCK; + +typedef enum IO_ASYNC_REQUEST_STATE { + IoAsyncRequestQueued = 0, + IoAsyncRequestRunning = 1, + IoAsyncRequestCompleted = 2, + IoAsyncRequestCancelled = 3, +} IO_ASYNC_REQUEST_STATE; + +typedef struct IO_ASYNC_REQUEST_OBJECT IO_ASYNC_REQUEST_OBJECT; + +typedef void (*IO_ASYNC_REQUEST_CLEANUP_ROUTINE)(IO_ASYNC_REQUEST_OBJECT* request, + void* context); +typedef KSTATUS (*IO_ASYNC_REQUEST_CANCEL_ROUTINE)(IO_ASYNC_REQUEST_OBJECT* request, + void* context); + +struct IO_ASYNC_REQUEST_OBJECT { + OBJECT Header; + LIST_ENTRY Link; + IO_ASYNC_REQUEST_STATE State; + uint8_t CancelRequested; + struct EVENT* WaitEvent; + struct EVENT* CompletionEvent; + struct KAPC* CompletionApc; + IO_STATUS_BLOCK* Iosb; + IO_STATUS_BLOCK IosbSnapshot; + MM_LOCKED_USER_BUFFER* LockedBuffer; + MM_LOCKED_USER_BUFFER* LockedIosb; + struct IRP* Irp; + IO_ASYNC_REQUEST_CLEANUP_ROUTINE CleanupRoutine; + void* CleanupContext; + IO_ASYNC_REQUEST_CANCEL_ROUTINE CancelRoutine; + void* CancelContext; +}; diff --git a/code/public/ntlite/ddk/ddk.h b/code/public/ntlite/ddk/ddk.h new file mode 100644 index 0000000..28d61dd --- /dev/null +++ b/code/public/ntlite/ddk/ddk.h @@ -0,0 +1,44 @@ +// Public nt-lite DDK root declarations. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NTL_DDK_VERSION 1u + +// Root DDK table passed to kernel drivers by the driver loader. +typedef struct NTL_DDK { + uint32_t Version; + const NTL_DDK_DEBUG* Debug; + const NTL_DDK_INTERRUPT* Interrupt; + const NTL_DDK_MEMORY* Memory; + const NTL_DDK_PLATFORM* Platform; + const NTL_DDK_SCHEDULER* Scheduler; + const NTL_DDK_TIMER* Timer; +} NTL_DDK; + +// Driver initialization record filled by DriverEntry in the DDK-table model. +typedef struct NTL_DRIVER_INIT { + const char* Name; +} NTL_DRIVER_INIT; diff --git a/code/public/ntlite/ddk/debug.h b/code/public/ntlite/ddk/debug.h new file mode 100644 index 0000000..18ccd3b --- /dev/null +++ b/code/public/ntlite/ddk/debug.h @@ -0,0 +1,28 @@ +// Public nt-lite DDK debugging declarations. + +#pragma once + +#include + +// Driver-visible debug output service table passed through NTL_DDK. +typedef struct NTL_DDK_DEBUG { + void (*Print)(const char* fmt, ...); +} NTL_DDK_DEBUG; + +// Current fatal categories used by kernel-mode driver diagnostics. +typedef enum KE_PANIC_CODE { + KE_PANIC_CODE_GENERIC = 0, + KE_PANIC_CODE_FAULT = 1, + KE_PANIC_CODE_IRQL = 2, + KE_PANIC_CODE_SELFTEST = 3, + KE_PANIC_CODE_TRAP = 4, + KE_PANIC_CODE_DRIVER = 5, + KE_PANIC_CODE_INIT = 6, + KE_PANIC_CODE_SCHEDULER = 7, +} KE_PANIC_CODE; + +// Emits a formatted debug message on the active kernel debug outputs. +__declspec(dllexport) void DbgPrint(const char* fmt, ...); + +// Stops the system with a formatted diagnostic message. +__declspec(dllexport) _Noreturn void KePanic(int code, const char* fmt, ...); diff --git a/code/public/ntlite/ddk/display.h b/code/public/ntlite/ddk/display.h new file mode 100644 index 0000000..0f571b6 --- /dev/null +++ b/code/public/ntlite/ddk/display.h @@ -0,0 +1,62 @@ +// Public nt-lite DDK display-miniport declarations. + +#pragma once + +#include +#include +#include +#include +#include + +typedef struct KE_CONSOLE_INFO { + uint32_t Columns; + uint32_t Rows; + uint32_t CursorX; + uint32_t CursorY; + uint16_t Attribute; +} KE_CONSOLE_INFO; + +typedef struct KE_DISPLAY_INFO { + char PrimaryName[32]; + DISPLAY_MODE Mode; + uint32_t Caps; + uint32_t DeviceCount; + DISPLAY_STATS ManagerStats; + DISPLAY_STATS DeviceStats; +} KE_DISPLAY_INFO; + +// Registers a display miniport device with the kernel display manager. +DISPLAY_API KSTATUS KeDisplayRegisterDevice(DISPLAY_DEVICE* device); + +// Sets the primary display device. +DISPLAY_API KSTATUS KeDisplaySetPrimary(DISPLAY_DEVICE* device); + +// Suspends or resumes fallback console drawing. +DISPLAY_API void KeDisplaySuspendConsole(bool suspend); + +// Queries the current display mode. +DISPLAY_API KSTATUS KeDisplayGetMode(DISPLAY_MODE* outMode); + +// Queries the current display size. +DISPLAY_API KSTATUS KeDisplayGetSize(int* outWidth, int* outHeight); + +typedef KSTATUS (*KE_DISPLAY_ROW_SOURCE)(void* context, int rowIndex, uint32_t* scratch, size_t pixelCount); + +DISPLAY_API KSTATUS KeDisplayBlit(int x, int y, int w, int h, const uint32_t* pixels); +DISPLAY_API KSTATUS KeDisplayBlitRows(int x, int y, int w, int h, KE_DISPLAY_ROW_SOURCE source, void* context, uint32_t* scratch); +DISPLAY_API KSTATUS KeDisplayFillRect(int x, int y, int w, int h, uint32_t color); +DISPLAY_API KSTATUS KeDisplayClear(uint32_t color); +DISPLAY_API KSTATUS KeDisplayCopyRect(int dstX, int dstY, int srcX, int srcY, int w, int h); +DISPLAY_API KSTATUS KeDisplayScroll(int lines); +DISPLAY_API KSTATUS KeDisplayPutChar(char c, int x, int y, uint32_t fg, uint32_t bg); +DISPLAY_API KSTATUS KeDisplayPrintChar(char c, uint32_t fg, uint32_t bg); +DISPLAY_API KSTATUS KeDisplayGetConsoleInfo(KE_CONSOLE_INFO* outInfo); +DISPLAY_API KSTATUS KeDisplaySetConsoleCursor(int col, int row); +DISPLAY_API KSTATUS KeDisplayFillConsoleChars(char c, int col, int row, size_t length, size_t* writtenOut); +DISPLAY_API KSTATUS KeDisplayFillConsoleAttrs(uint16_t attr, int col, int row, size_t length, size_t* writtenOut); +DISPLAY_API KSTATUS KeDisplayPresent(const DISPLAY_RECT* rects, size_t rectCount); +DISPLAY_API KSTATUS KeDisplaySync(void); +DISPLAY_API KSTATUS KeDisplayQueryInfo(KE_DISPLAY_INFO* outInfo); +DISPLAY_API KSTATUS KeDisplaySetCursorImage(int width, int height, int hotX, int hotY, const uint32_t* argbPixels); +DISPLAY_API KSTATUS KeDisplaySetCursorPosition(int x, int y); +DISPLAY_API KSTATUS KeDisplayShowCursor(bool show); diff --git a/code/public/ntlite/ddk/display_cursor.h b/code/public/ntlite/ddk/display_cursor.h new file mode 100644 index 0000000..a6598dd --- /dev/null +++ b/code/public/ntlite/ddk/display_cursor.h @@ -0,0 +1,35 @@ +// Public nt-lite DDK default cursor declarations. + +#pragma once +#include + +#define DISPLAY_DEFAULT_CURSOR_W 16 +#define DISPLAY_DEFAULT_CURSOR_H 25 + +static const uint32_t gDisplayDefaultCursorArgb[DISPLAY_DEFAULT_CURSOR_H][DISPLAY_DEFAULT_CURSOR_W] = { + { 0x7F575757, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFAFAFA, 0x855D5D5D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFEFEFE, 0xFFFFFFFF, 0x865E5E5E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFDFDFD, 0xFFFDFDFD, 0xFFFFFFFF, 0x8A626262, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x8D656565, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x8E666666, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x91696969, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x946C6C6C, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x956D6D6D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x99717171, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x9B737373, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x9D757575, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0xA0787878, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFDFDFD, 0xFFFDFDFD, 0xFFFCFCFC, 0xFFF9F9F9, 0xFFFFFFFF, 0xA1797979, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFEFEFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xAE868686, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFFFFFF, 0xFDD5D5D5, 0xF4CCCCCC, 0xF4CCCCCC, 0xF4CCCCCC, 0xF3CBCBCB, 0xF1C9C9C9, 0xFAD2D2D2, 0x7E565656 }, + { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFEFEFEF, 0xFFFCFCFC, 0xFFFFFFFF, 0x9A727272, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x7F575757, 0x8F676767, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFE0E0E0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x90686868, 0x00000000, 0x00000000, 0xFFEBEBEB, 0xFFFFFFFF, 0xFFFFFFFF, 0x81595959, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFDFDFD, 0xFFFFFFFF, 0x8C646464, 0x00000000, 0x00000000, 0x00000000, 0xB78F8F8F, 0xFFFFFFFF, 0xFFFEFEFE, 0xECC4C4C4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0xFFFFFFFF, 0x90686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x50282828, 0xFFF9F9F9, 0xFFFFFFFF, 0xFFFFFFFF, 0x623A3A3A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x865E5E5E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xD8B0B0B0, 0xFFFFFFFF, 0xFFFFFFFF, 0xCDA5A5A5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6C444444, 0xFFFFFFFF, 0xFFFCFCFC, 0xFFF4F4F4, 0x4D252525, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xF2CACACA, 0xFFFFFFFF, 0xFFFFFFFF, 0x99717171, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, + { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8E666666, 0xEFC7C7C7, 0x7D555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, +}; diff --git a/code/public/ntlite/ddk/dpc.h b/code/public/ntlite/ddk/dpc.h new file mode 100644 index 0000000..a5648c0 --- /dev/null +++ b/code/public/ntlite/ddk/dpc.h @@ -0,0 +1,35 @@ +// Public nt-lite DDK deferred procedure call declarations. + +#pragma once + +#include +#include +#include +#include + +typedef struct KDPC KDPC; + +typedef void (*KDEFERRED_ROUTINE)(KDPC* dpc, + void* context, + void* systemArgument1, + void* systemArgument2); + +// Legacy DPC storage used by current kernel-mode drivers. +struct KDPC { + LIST_ENTRY Link; + KDEFERRED_ROUTINE Routine; + void* Context; + void* SystemArgument1; + void* SystemArgument2; + volatile long Inserted; +}; + +// Initializes a DPC object. +__declspec(dllexport) void KeInitializeDpc(KDPC* dpc, + KDEFERRED_ROUTINE routine, + void* context); + +// Queues a DPC if it is not already queued. +__declspec(dllexport) bool KeInsertQueueDpc(KDPC* dpc, + void* systemArgument1, + void* systemArgument2); diff --git a/code/public/ntlite/ddk/driver.h b/code/public/ntlite/ddk/driver.h new file mode 100644 index 0000000..9621e9d --- /dev/null +++ b/code/public/ntlite/ddk/driver.h @@ -0,0 +1,12 @@ +// Public nt-lite DDK driver entry declarations. + +#pragma once + +#include + +struct NTL_DDK; +struct NTL_DRIVER_INIT; + +// Kernel driver entrypoint used by the future DDK-table driver model. +typedef KSTATUS (*NTL_DRIVER_ENTRY_FN)(const struct NTL_DDK* ddk, + struct NTL_DRIVER_INIT* init); diff --git a/code/public/ntlite/ddk/event.h b/code/public/ntlite/ddk/event.h new file mode 100644 index 0000000..be58f8b --- /dev/null +++ b/code/public/ntlite/ddk/event.h @@ -0,0 +1,45 @@ +// Public nt-lite DDK event declarations. + +#pragma once + +#include +#include +#include +#include +#include + +typedef enum EVENT_TYPE { + EventAutoReset, + EventManualReset, +} EVENT_TYPE; + +typedef struct EVENT { + OBJECT Header; + SPINLOCK Lock; + EVENT_TYPE Type; + uint32_t Signaled; + LIST_ENTRY WaitList; + LIST_ENTRY MultiWaitList; +} EVENT; + +// Creates an event object. +__declspec(dllexport) KSTATUS KeEventCreate(EVENT_TYPE type, uint32_t initialState, EVENT** out); + +// Signals an event. +__declspec(dllexport) void KeSignalEvent(EVENT* event); + +// Clears an event. +__declspec(dllexport) void KeClearEvent(EVENT* event); + +// Waits for an event. +__declspec(dllexport) KSTATUS KeWaitForEvent(EVENT* event, uint8_t alertable); + +// Attempts to wait for an event without blocking. +__declspec(dllexport) KSTATUS KeTryWaitEvent(EVENT* event); + +// Waits for one of several events. +__declspec(dllexport) KSTATUS KeWaitForMultipleEvents(EVENT** events, + uint32_t count, + uint8_t alertable, + uint64_t timeoutMs, + uint32_t* signaledIndexOut); diff --git a/code/public/ntlite/ddk/file.h b/code/public/ntlite/ddk/file.h new file mode 100644 index 0000000..ec0b760 --- /dev/null +++ b/code/public/ntlite/ddk/file.h @@ -0,0 +1,132 @@ +// Public nt-lite DDK filesystem declarations. + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef SYS_DIR_ENTRY KDIR_ENTRY; +#define KDIR_NAME_MAX SYS_DIR_NAME_MAX + +typedef void (*IO_FS_ASYNC_COMPLETE)(void* completeContext, + KSTATUS status, + size_t information); + +typedef struct IO_FILESYSTEM_STATS { + uint64_t PathLookups; + uint64_t PathCacheHits; + uint64_t PathCacheMisses; + uint64_t PathCacheStores; + uint64_t PathCacheInvalidations; + uint64_t PathCacheGeneration; + uint64_t DirectorySearches; + uint64_t DirectoryBlocksRead; + uint64_t DirectoryEntriesScanned; + uint64_t DataReadRuns; + uint64_t DataReadSectors; + uint64_t DataReadRunMerges; + uint64_t MaxDataReadSpanSectors; +} IO_FILESYSTEM_STATS; + +typedef struct IO_FILE_IDENTITY { + uint64_t VolumeId; + uint64_t FileId; + uint64_t Generation; + uint64_t Size; +} IO_FILE_IDENTITY; + +typedef struct IO_FILESYSTEM { + KSTATUS (*Open)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path, void** fileCtx); + KSTATUS (*Read)(struct IO_FILESYSTEM* fs, void* fileCtx, uint64_t offset, void* buf, size_t size, size_t* bytesRead); + KSTATUS (*Write)(struct IO_FILESYSTEM* fs, void* fileCtx, uint64_t offset, const void* buf, size_t size, size_t* bytesWritten); + KSTATUS (*ReadAsync)(struct IO_FILESYSTEM* fs, void* fileCtx, uint64_t offset, void* buf, size_t size, IO_FS_ASYNC_COMPLETE complete, void* completeContext); + KSTATUS (*WriteAsync)(struct IO_FILESYSTEM* fs, void* fileCtx, uint64_t offset, const void* buf, size_t size, IO_FS_ASYNC_COMPLETE complete, void* completeContext); + KSTATUS (*Create)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path, void** fileCtx); + KSTATUS (*Delete)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path); + KSTATUS (*Rename)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW oldPath, SYS_STRING_VIEW newPath); + KSTATUS (*CreateDir)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path); + KSTATUS (*RemoveDir)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path); + KSTATUS (*Truncate)(struct IO_FILESYSTEM* fs, void* fileCtx, uint64_t newSize, uint32_t fileFlags); + uint64_t (*GetSize)(struct IO_FILESYSTEM* fs, void* fileCtx); + KSTATUS (*QueryInfo)(struct IO_FILESYSTEM* fs, void* fileCtx, SYS_FILE_STAT* out); + KSTATUS (*Stat)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW path, SYS_FILE_STAT* out); + KSTATUS (*QueryIdentity)(struct IO_FILESYSTEM* fs, void* fileCtx, IO_FILE_IDENTITY* out); + void (*Close)(struct IO_FILESYSTEM* fs, void* fileCtx); + void (*QueryStats)(struct IO_FILESYSTEM* fs, IO_FILESYSTEM_STATS* out); + void* DriverCtx; + KSTATUS (*OpenDir)(struct IO_FILESYSTEM* fs, SYS_STRING_VIEW dirPath, void** dirCtx); + KSTATUS (*ReadDir)(struct IO_FILESYSTEM* fs, void* dirCtx, KDIR_ENTRY* out); + void (*CloseDir)(struct IO_FILESYSTEM* fs, void* dirCtx); +} IO_FILESYSTEM; + +struct EVENT; +struct KAPC; +typedef struct MM_LOCKED_USER_BUFFER MM_LOCKED_USER_BUFFER; +typedef struct IO_ASYNC_FILE_REQUEST_OBJECT IO_ASYNC_FILE_REQUEST_OBJECT; + +#define IO_FILE_FLAG_NO_CACHE 0x00000001u +#define IO_FILE_FLAG_SKIP_ZERO_EXTEND 0x00000002u +#define IO_FILE_FLAG_APPEND 0x00000004u + +typedef struct FILE_OBJECT { + OBJECT Header; + IO_FILESYSTEM* Fs; + void* FileCtx; + SPINLOCK Lock; + uint64_t Size; + uint64_t Offset; + uint32_t Flags; + uint32_t ReadaheadScore; + uint64_t ReadaheadNextOffset; + uint64_t ReadaheadIssuedUntil; + uint64_t ReadaheadSuppressedUntil; +} FILE_OBJECT; + +typedef struct DIR_OBJECT { + OBJECT Header; + IO_FILESYSTEM* Fs; + void* DirCtx; +} DIR_OBJECT; + +typedef struct IO_VOLUME_PARAMS { + uint8_t DiskIndex; + uint64_t PartitionLba; + uint64_t PartitionSize; +} IO_VOLUME_PARAMS; + +__declspec(dllexport) KSTATUS IoRegisterFilesystem(uint8_t driveIndex, IO_FILESYSTEM* fs, const IO_VOLUME_PARAMS* vol); +__declspec(dllexport) KSTATUS IoUnregisterFilesystem(uint8_t driveIndex); +__declspec(dllexport) KSTATUS IoUnregisterFilesystemsForDisk(uint8_t diskIndex); +__declspec(dllexport) bool IoFilesystemPresent(uint8_t driveIndex); +__declspec(dllexport) void IoQueryFilesystemStats(IO_FILESYSTEM_STATS* out); +__declspec(dllexport) KSTATUS IoOpenFile(SYS_STRING_VIEW path, FILE_OBJECT** out); +__declspec(dllexport) KSTATUS IoReadFile(FILE_OBJECT* file, void* buf, size_t size, size_t* bytesRead); +__declspec(dllexport) KSTATUS IoReadFileAt(FILE_OBJECT* file, uint64_t offset, void* buf, size_t size, size_t* bytesRead); +__declspec(dllexport) KSTATUS IoWriteFile(FILE_OBJECT* file, const void* buf, size_t size, size_t* bytesWritten); +__declspec(dllexport) KSTATUS IoWriteFileAt(FILE_OBJECT* file, uint64_t offset, const void* buf, size_t size, size_t* bytesWritten); +__declspec(dllexport) KSTATUS IoFlushFile(FILE_OBJECT* file); +__declspec(dllexport) KSTATUS IoCreateFile(SYS_STRING_VIEW path, FILE_OBJECT** out); +__declspec(dllexport) KSTATUS IoDeleteFile(SYS_STRING_VIEW path); +__declspec(dllexport) KSTATUS IoRenameFile(SYS_STRING_VIEW oldPath, SYS_STRING_VIEW newPath); +__declspec(dllexport) KSTATUS IoCreateDir(SYS_STRING_VIEW path); +__declspec(dllexport) KSTATUS IoRemoveDir(SYS_STRING_VIEW path); +__declspec(dllexport) KSTATUS IoTruncateFile(FILE_OBJECT* file, uint64_t newSize); +__declspec(dllexport) KSTATUS IoSeekFile(FILE_OBJECT* file, uint64_t offset); +__declspec(dllexport) uint64_t IoGetFileSize(FILE_OBJECT* file); +__declspec(dllexport) KSTATUS IoGetFileStat(FILE_OBJECT* file, SYS_FILE_STAT* out); +__declspec(dllexport) KSTATUS IoStatFile(SYS_STRING_VIEW path, SYS_FILE_STAT* out); +__declspec(dllexport) KSTATUS IoQueryFileIdentity(FILE_OBJECT* file, IO_FILE_IDENTITY* out); +__declspec(dllexport) void IoCloseFile(FILE_OBJECT* file); +__declspec(dllexport) KSTATUS IoOpenDir(SYS_STRING_VIEW dirPath, DIR_OBJECT** out); +__declspec(dllexport) KSTATUS IoReadDir(DIR_OBJECT* dir, KDIR_ENTRY* entryOut); +__declspec(dllexport) void IoCloseDir(DIR_OBJECT* dir); +__declspec(dllexport) KSTATUS IoSetCwd(SYS_STRING_VIEW path); +__declspec(dllexport) KSTATUS IoRealPath(SYS_STRING_VIEW path, char* buffer, size_t bufferSize, size_t* requiredSizeOut); diff --git a/code/public/ntlite/ddk/interrupt.h b/code/public/ntlite/ddk/interrupt.h new file mode 100644 index 0000000..96ca5ed --- /dev/null +++ b/code/public/ntlite/ddk/interrupt.h @@ -0,0 +1,17 @@ +// Public nt-lite DDK interrupt declarations. + +#pragma once + +#include +#include + +// Driver-visible interrupt services. +typedef struct NTL_DDK_INTERRUPT { + KSTATUS (*AllocateMsiVector)(uint8_t* outIrq); +} NTL_DDK_INTERRUPT; + +// Allocates one kernel IRQ slot for MSI delivery. +__declspec(dllexport) KSTATUS KeIrqAllocateMsiVector(uint8_t* outIrq); + +// Registers a legacy interrupt handler for an IRQ slot. +__declspec(dllexport) void KeIrqRegister(uint8_t irq, void (*handler)(void)); diff --git a/code/public/ntlite/ddk/irp.h b/code/public/ntlite/ddk/irp.h new file mode 100644 index 0000000..c6a5bbe --- /dev/null +++ b/code/public/ntlite/ddk/irp.h @@ -0,0 +1,226 @@ +// Public nt-lite DDK IRP declarations. + +#pragma once + +// This is the legacy IRP shape made self-contained for DDK users. The next +// architectural step is to hide this layout behind request accessors. + +#include +#include +#include +#include +#include +#include + +struct EVENT; +struct SEMAPHORE; +struct KAPC; +typedef struct DEVICE_OBJECT DEVICE_OBJECT; + +// IRP major functions. +typedef enum IO_MAJOR_FUNCTION { + IRP_MJ_CREATE = 0, + IRP_MJ_CLOSE = 1, + IRP_MJ_READ = 2, + IRP_MJ_WRITE = 3, + IRP_MJ_DEVICE_CONTROL = 4, + IRP_MJ_INTERNAL_DEVICE_CONTROL = 5, + IRP_MJ_PNP = 6, + IRP_MJ_POWER = 7, + IRP_MJ_MAXIMUM_FUNCTION = 8, +} IO_MAJOR_FUNCTION; + +// PnP minor functions. +typedef enum IO_PNP_MINOR_FUNCTION { + IRP_MN_START_DEVICE = 0, + IRP_MN_QUERY_REMOVE_DEVICE = 1, + IRP_MN_CANCEL_REMOVE_DEVICE = 2, + IRP_MN_SURPRISE_REMOVAL = 3, + IRP_MN_REMOVE_DEVICE = 4, + IRP_MN_QUERY_DEVICE_RELATIONS = 5, + IRP_MN_QUERY_ID = 6, + IRP_MN_QUERY_CAPABILITIES = 7, +} IO_PNP_MINOR_FUNCTION; + +// Device relation query types. +typedef enum IO_DEVICE_RELATION_TYPE { + IoBusRelations = 0, + IoRemovalRelations = 1, +} IO_DEVICE_RELATION_TYPE; + +#define IRP_FLAG_PRIORITY (1u << 0) +#define IRP_FLAG_CANCELLED (1u << 1) +#define IRP_FLAG_COMPLETED (1u << 2) + +// Current public IRP stack location layout. +typedef struct IO_STACK_LOCATION { + IO_MAJOR_FUNCTION MajorFunction; + uint8_t MinorFunction; + DEVICE_OBJECT* DeviceObject; + + union { + struct { + uint64_t ByteOffset; + uint32_t Length; + } ReadWrite; + + struct { + uint32_t IoControlCode; + void* InputBuffer; + uint32_t InputLength; + void* OutputBuffer; + uint32_t OutputLength; + } DeviceIoControl; + + struct { + IO_DEVICE_RELATION_TYPE RelationType; + } QueryDeviceRelations; + + struct { + uint32_t IdType; + } QueryId; + } Parameters; +} IO_STACK_LOCATION; + +typedef struct IRP IRP; + +typedef void (*IRP_COMPLETION_FN)(IRP* irp, void* ctx); +typedef void (*IRP_CANCEL_ROUTINE)(DEVICE_OBJECT* device, IRP* irp); + +// Current public IRP layout. +typedef struct IRP { + LIST_ENTRY Link; + + volatile KSTATUS Status; + volatile size_t Information; + + uint32_t Flags; + volatile bool Cancel; + SPINLOCK CancelLock; + KIRQL CancelIrql; + IRP_CANCEL_ROUTINE CancelRoutine; + + struct EVENT* CompletionEvent; + struct KAPC* CompletionApc; + IRP_COMPLETION_FN CompletionFn; + void* CompletionCtx; + + void* UserBuffer; + void* SystemBuffer; + + uint8_t StackCount; + uint8_t CurrentLocation; + + uint8_t HwSlot; + void* DriverCtx; + + IO_STACK_LOCATION Stack[1]; +} IRP; + +// Current remove-lock layout. +typedef struct IO_REMOVE_LOCK { + SPINLOCK Lock; + volatile long IoCount; + bool Removing; + struct EVENT* RemovedEvent; +} IO_REMOVE_LOCK; + +// Current per-driver IRP queue layout. +typedef struct IRP_QUEUE { + SPINLOCK Lock; + LIST_ENTRY Head; + struct SEMAPHORE* Semaphore; +} IRP_QUEUE; + +typedef void (*IRP_QUEUE_CANCEL_CALLBACK)(IRP* irp, void* context); + +// Initializes a remove lock before it is used by a device. +__declspec(dllexport) KSTATUS IoInitializeRemoveLock(IO_REMOVE_LOCK* lock); + +// Destroys a remove lock after the owning device has drained I/O. +__declspec(dllexport) void IoDestroyRemoveLock(IO_REMOVE_LOCK* lock); + +// Acquires a remove lock for a request. +__declspec(dllexport) KSTATUS IoAcquireRemoveLock(IO_REMOVE_LOCK* lock, IRP* irp); + +// Releases a remove lock for a request. +__declspec(dllexport) void IoReleaseRemoveLock(IO_REMOVE_LOCK* lock, IRP* irp); + +// Releases a remove lock and waits for outstanding requests to drain. +__declspec(dllexport) void IoReleaseRemoveLockAndWait(IO_REMOVE_LOCK* lock, IRP* removeIrp); + +// Initializes a driver-internal IRP queue. +__declspec(dllexport) void IrpQueueInit(IRP_QUEUE* q, struct SEMAPHORE* sem); + +// Enqueues an IRP into a driver-internal queue. +__declspec(dllexport) void IrpQueueEnqueue(IRP_QUEUE* q, IRP* irp); + +// Dequeues an IRP from a driver-internal queue. +__declspec(dllexport) IRP* IrpQueueDequeue(IRP_QUEUE* q); + +// Cancels every IRP in a queue and invokes a callback for each one. +__declspec(dllexport) void IrpQueueCancelAllEx(IRP_QUEUE* q, + KSTATUS status, + IRP_QUEUE_CANCEL_CALLBACK callback, + void* context); + +// Cancels every IRP in a queue. +__declspec(dllexport) void IrpQueueCancelAll(IRP_QUEUE* q, KSTATUS status); + +// Allocates an IRP with the requested stack depth. +__declspec(dllexport) KSTATUS IoAllocateIrp(uint8_t stackCount, IRP** outIrp); + +// Frees an IRP allocated by IoAllocateIrp. +__declspec(dllexport) void IoFreeIrp(IRP* irp); + +// Reinitializes an existing IRP for reuse. +__declspec(dllexport) void IoInitializeIrp(IRP* irp, uint8_t stackCount); + +// Returns the current IRP stack location. +__declspec(dllexport) IO_STACK_LOCATION* IoGetCurrentIrpStackLocation(IRP* irp); + +// Returns the next lower IRP stack location. +__declspec(dllexport) IO_STACK_LOCATION* IoGetNextIrpStackLocation(IRP* irp); + +// Advances the IRP without copying stack parameters. +__declspec(dllexport) void IoSkipCurrentIrpStackLocation(IRP* irp); + +// Copies the current stack location to the next lower location. +__declspec(dllexport) void IoCopyCurrentIrpStackLocationToNext(IRP* irp); + +// Registers a completion callback for an IRP. +__declspec(dllexport) void IoSetCompletionRoutine(IRP* irp, IRP_COMPLETION_FN fn, void* ctx); + +// Sets the cancel routine and returns the previous one. +__declspec(dllexport) IRP_CANCEL_ROUTINE IoSetCancelRoutine(IRP* irp, IRP_CANCEL_ROUTINE routine); + +// Marks an IRP cancelled and invokes its cancel routine when present. +__declspec(dllexport) void IoCancelIrp(IRP* irp); + +// Builds a read or write IRP. +__declspec(dllexport) void IoBuildReadWriteIrp(IRP* irp, + IO_MAJOR_FUNCTION major, + uint64_t byteOffset, + uint32_t length, + void* buffer); + +// Builds a PnP IRP. +__declspec(dllexport) void IoBuildPnpIrp(IRP* irp, IO_PNP_MINOR_FUNCTION minor); + +// Builds a device-control IRP. +__declspec(dllexport) void IoBuildDeviceIoControlIrp(IRP* irp, + IO_MAJOR_FUNCTION major, + uint32_t ioControlCode, + void* inputBuffer, + uint32_t inputLength, + void* outputBuffer, + uint32_t outputLength); + +// Completes an IRP exactly once. +__declspec(dllexport) KSTATUS IoCompleteRequest(IRP* irp, KSTATUS status, size_t information); + +// Submits an IRP to a specific top-of-stack device object. +__declspec(dllexport) KSTATUS IoSubmitIrp(DEVICE_OBJECT* device, IRP* irp); + +// Submits an IRP and waits for completion. +__declspec(dllexport) KSTATUS IoSubmitIrpSync(DEVICE_OBJECT* device, IRP* irp); diff --git a/code/public/ntlite/ddk/irql.h b/code/public/ntlite/ddk/irql.h new file mode 100644 index 0000000..b07fdb5 --- /dev/null +++ b/code/public/ntlite/ddk/irql.h @@ -0,0 +1,35 @@ +// Public nt-lite DDK IRQL declarations. + +#pragma once + +#include + +// Interrupt request level value used by DDK synchronization and IRP state. +typedef uint8_t KIRQL; + +#define PASSIVE_LEVEL ((KIRQL)0) +#define APC_LEVEL ((KIRQL)1) +#define DISPATCH_LEVEL ((KIRQL)2) +#define DIRQL_BASE ((KIRQL)16) +#define HIGH_LEVEL ((KIRQL)31) + +// Returns the current processor's software IRQL. +__declspec(dllexport) KIRQL KeGetCurrentIrql(void); + +// Raises to newIrql and returns the previous level. +__declspec(dllexport) KIRQL KeRaiseIrql(KIRQL newIrql); + +// Restores a previously returned level. +__declspec(dllexport) void KeLowerIrql(KIRQL oldIrql); + +// Asserts that the current IRQL exactly matches expected. +__declspec(dllexport) void KeAssertIrql(KIRQL expected); + +// Asserts that the current IRQL is at or below maxIrql. +__declspec(dllexport) void KeAssertIrqlAtOrBelow(KIRQL maxIrql); + +// Returns nonzero when the current context may block. +__declspec(dllexport) int KeCanWait(void); + +// Returns a diagnostic name for an IRQL. +__declspec(dllexport) const char* KeIrqlName(KIRQL irql); diff --git a/code/public/ntlite/ddk/list.h b/code/public/ntlite/ddk/list.h new file mode 100644 index 0000000..0d682c6 --- /dev/null +++ b/code/public/ntlite/ddk/list.h @@ -0,0 +1,51 @@ +// Public nt-lite DDK intrusive list declarations. + +#pragma once + +#include + +// Doubly-linked intrusive list node. +typedef struct LIST_ENTRY { + struct LIST_ENTRY* Fwd; + struct LIST_ENTRY* Bwd; +} LIST_ENTRY; + +#define LIST_INIT(head) ((head)->Fwd = (head)->Bwd = (head)) +#define LIST_IS_EMPTY(head) ((head)->Fwd == (head)) + +// Recover the containing struct pointer from an embedded list node. +#define CONTAINING_RECORD(ptr, type, member) \ + ((type *)((char *)(ptr) - offsetof(type, member))) + +// Inserts a node at the tail of a list. +static inline void ListInsertTail(LIST_ENTRY* head, LIST_ENTRY* node) { + node->Bwd = head->Bwd; + node->Fwd = head; + head->Bwd->Fwd = node; + head->Bwd = node; +} + +// Inserts a node at the head of a list. +static inline void ListInsertHead(LIST_ENTRY* head, LIST_ENTRY* node) { + node->Fwd = head->Fwd; + node->Bwd = head; + head->Fwd->Bwd = node; + head->Fwd = node; +} + +// Removes a node from its current list. +static inline void ListRemove(LIST_ENTRY* node) { + node->Bwd->Fwd = node->Fwd; + node->Fwd->Bwd = node->Bwd; + node->Fwd = node->Bwd = node; +} + +// Removes and returns the first node in a list, or NULL when empty. +static inline LIST_ENTRY* ListPopHead(LIST_ENTRY* head) { + if (LIST_IS_EMPTY(head)) + return (LIST_ENTRY*)0; + + LIST_ENTRY* node = head->Fwd; + ListRemove(node); + return node; +} diff --git a/code/public/ntlite/ddk/memory.h b/code/public/ntlite/ddk/memory.h new file mode 100644 index 0000000..c9450ec --- /dev/null +++ b/code/public/ntlite/ddk/memory.h @@ -0,0 +1,186 @@ +// Public nt-lite DDK memory declarations. + +#pragma once + +#include +#include +#include +#include + +#ifndef PAGE_SIZE +#define PAGE_SIZE 4096ULL +#endif +#ifndef PAGE_MASK +#define PAGE_MASK (~(PAGE_SIZE - 1ULL)) +#endif + +#define NTL_DDK_PAGE_SIZE PAGE_SIZE +#define NTL_DDK_PAGE_PRESENT (1ULL << 0) +#define NTL_DDK_PAGE_WRITE (1ULL << 1) +#define NTL_DDK_PAGE_WRITETHROUGH (1ULL << 3) +#define NTL_DDK_PAGE_NOCACHE (1ULL << 4) +#define NTL_DDK_PAGE_NX (1ULL << 63) + +#ifndef PAGE_PRESENT +#define PAGE_PRESENT (1ULL << 0) +#endif +#ifndef PAGE_WRITE +#define PAGE_WRITE (1ULL << 1) +#endif +#ifndef PAGE_USER +#define PAGE_USER (1ULL << 2) +#endif +#ifndef PAGE_WRITETHROUGH +#define PAGE_WRITETHROUGH (1ULL << 3) +#endif +#ifndef PAGE_NOCACHE +#define PAGE_NOCACHE (1ULL << 4) +#endif +#ifndef PAGE_ACCESSED +#define PAGE_ACCESSED (1ULL << 5) +#endif +#ifndef PAGE_DIRTY +#define PAGE_DIRTY (1ULL << 6) +#endif +#ifndef PAGE_NX +#define PAGE_NX (1ULL << 63) +#endif + +#ifndef NTL_PHYSICAL_ADDRESS_DEFINED +typedef uint64_t PHYSICAL_ADDRESS; +#define NTL_PHYSICAL_ADDRESS_DEFINED 1 +#endif + +typedef enum NTL_DDK_MAP_MODE { + NtlDdkMapFailIfPresent = 0, + NtlDdkMapReplaceExisting = 1, +} NTL_DDK_MAP_MODE; + +#ifndef NTL_MM_PTE_MAP_MODE_DEFINED +typedef enum MM_PTE_MAP_MODE { + MmPteMapFailIfPresent = 0, + MmPteMapReplaceExisting = 1, +} MM_PTE_MAP_MODE; +#define NTL_MM_PTE_MAP_MODE_DEFINED 1 +#endif + +#ifndef NTL_MM_PFN_TYPES_DEFINED +typedef enum MM_PFN_STATE { + MmPfnStateInvalid = 0, + MmPfnStateReserved, + MmPfnStateFree, + MmPfnStateZeroed, + MmPfnStateActive, + MmPfnStateStandby, + MmPfnStateModified, +} MM_PFN_STATE; + +typedef enum MM_PFN_USAGE { + MmPfnUseNone = 0, + MmPfnUseKernel, + MmPfnUsePageTable, + MmPfnUseUser, + MmPfnUseCleanFileCache, + MmPfnUseImage, + MmPfnUseMappedFile, + MmPfnUseAnonymous, + MmPfnUseCow, + MmPfnUseSurface, + MmPfnUseDriver, + MmPfnUseDma, + MmPfnUseBootloader, + MmPfnUsePfnDatabase, + MmPfnUseMmio, +} MM_PFN_USAGE; + +typedef struct MM_PFN { + uint16_t State; + uint16_t Usage; + uint16_t RefCount; + uint16_t PinCount; + uint32_t Flags; + uint32_t MappedCount; + void* Owner; + uint64_t BackingPage; +} MM_PFN; +#define NTL_MM_PFN_TYPES_DEFINED 1 +#endif + +#define MM_POOL_TAG(a, b, c, d) \ + ((uint32_t)(uint8_t)(a) | ((uint32_t)(uint8_t)(b) << 8) | \ + ((uint32_t)(uint8_t)(c) << 16) | ((uint32_t)(uint8_t)(d) << 24)) + +// Driver-visible memory services. These are intentionally narrower than the +// kernel memory-manager surface. +typedef struct NTL_DDK_MEMORY { + void* (*PhysToVirt)(uint64_t physicalAddress); + KSTATUS (*MapPage)(uintptr_t virtualAddress, + uint64_t physicalAddress, + uint64_t pageFlags, + NTL_DDK_MAP_MODE mode); +} NTL_DDK_MEMORY; + +// Allocates from kernel pool for current kernel-mode drivers. +__declspec(dllexport) void* MmAllocatePool(size_t size); + +// Allocates tagged memory from kernel pool for current kernel-mode drivers. +__declspec(dllexport) void* MmAllocatePoolTag(size_t size, uint32_t tag); + +// Frees kernel pool memory. +__declspec(dllexport) void MmFreePool(void* ptr); + +// Reallocates kernel pool memory. +__declspec(dllexport) void* MmReallocatePool(void* ptr, size_t newSize); + +// Allocates one physical frame for a specific driver-visible usage. +__declspec(dllexport) PHYSICAL_ADDRESS MmPfnAllocate(MM_PFN_USAGE usage); + +// Allocates one physical frame below maxExclusive. +__declspec(dllexport) PHYSICAL_ADDRESS MmPfnAllocateBelow(PHYSICAL_ADDRESS maxExclusive, MM_PFN_USAGE usage); + +// Allocates one physical frame in a range. +__declspec(dllexport) PHYSICAL_ADDRESS MmPfnAllocateInRange(PHYSICAL_ADDRESS minInclusive, + PHYSICAL_ADDRESS maxExclusive, + MM_PFN_USAGE usage); + +// Allocates contiguous physical frames. +__declspec(dllexport) PHYSICAL_ADDRESS MmPfnAllocateContiguous(size_t count, MM_PFN_USAGE usage); + +// Releases a frame reference. +__declspec(dllexport) KSTATUS MmPfnFree(PHYSICAL_ADDRESS frame); + +// Retains a physical frame. +__declspec(dllexport) KSTATUS MmPfnRetain(PHYSICAL_ADDRESS frame); + +// Releases a retained physical frame. +__declspec(dllexport) KSTATUS MmPfnRelease(PHYSICAL_ADDRESS frame); + +// Pins a physical frame. +__declspec(dllexport) KSTATUS MmPfnPin(PHYSICAL_ADDRESS frame); + +// Unpins a physical frame. +__declspec(dllexport) KSTATUS MmPfnUnpin(PHYSICAL_ADDRESS frame); + +// Returns the PFN database entry for a frame. +__declspec(dllexport) MM_PFN* MmPfnGet(PHYSICAL_ADDRESS frame); + +// Returns the direct-map alias for a physical frame. +__declspec(dllexport) void* MmPfnToVirtual(PHYSICAL_ADDRESS frame); + +// Maps one page into the shared kernel address space. +__declspec(dllexport) KSTATUS MmPteMapPage(uintptr_t virt, + PHYSICAL_ADDRESS phys, + uint64_t flags, + MM_PTE_MAP_MODE mode); + +// Removes one page mapping from the shared kernel address space. +__declspec(dllexport) KSTATUS MmPteUnmapPage(uintptr_t virt); + +// Replaces flags on a mapped range. +__declspec(dllexport) KSTATUS MmPteProtectRange(uintptr_t virt, size_t size, uint64_t flags); + +// Translates a virtual address through the shared kernel page tables. +__declspec(dllexport) PHYSICAL_ADDRESS MmPteTranslate(uintptr_t virt); + +// Returns the physical address and flags for a mapped page. +__declspec(dllexport) KSTATUS MmPteQueryPage(uintptr_t virt, PHYSICAL_ADDRESS* physOut, uint64_t* flagsOut); diff --git a/code/public/ntlite/ddk/mutex.h b/code/public/ntlite/ddk/mutex.h new file mode 100644 index 0000000..1dc405b --- /dev/null +++ b/code/public/ntlite/ddk/mutex.h @@ -0,0 +1,28 @@ +// Public nt-lite DDK mutex declarations. + +#pragma once + +#include +#include +#include +#include +#include + +typedef struct MUTEX { + OBJECT Header; + SPINLOCK Lock; + THREAD* Owner; + LIST_ENTRY WaitList; +} MUTEX; + +// Creates a mutex object. +__declspec(dllexport) KSTATUS KeMutexCreate(MUTEX** out); + +// Acquires a mutex, blocking when necessary. +__declspec(dllexport) KSTATUS KeAcquireMutex(MUTEX* mutex); + +// Attempts to acquire a mutex without blocking. +__declspec(dllexport) KSTATUS KeTryAcquireMutex(MUTEX* mutex); + +// Releases a mutex. +__declspec(dllexport) void KeReleaseMutex(MUTEX* mutex); diff --git a/code/public/ntlite/ddk/object.h b/code/public/ntlite/ddk/object.h new file mode 100644 index 0000000..5e22cda --- /dev/null +++ b/code/public/ntlite/ddk/object.h @@ -0,0 +1,46 @@ +// Public nt-lite DDK object declarations. + +#pragma once + +#include +#include + +// Kernel object type identifiers used by the legacy object header. +typedef enum OBJECT_TYPE { + ObjectTypeProcess = 1, + ObjectTypeThread = 2, + ObjectTypeMutex = 3, + ObjectTypeSemaphore = 4, + ObjectTypeEvent = 5, + ObjectTypeQueue = 6, + ObjectTypeFile = 7, + ObjectTypeDir = 8, + ObjectTypeAsyncIo = 9, + ObjectTypeSocket = 10, + ObjectTypeDevice = 11, + ObjectTypeDriver = 12, + ObjectTypeUsbDevice = 13, + ObjectTypeUsbPipe = 14, + ObjectTypeFileMapping = 15, + ObjectTypeSurface = 16, + ObjectTypeInputQueue = 17, + ObjectTypeImageSection = 18, + ObjectTypeTimer = 19, + ObjectTypeModule = 20, +} OBJECT_TYPE; + +// Legacy object header embedded by current driver/device objects. +typedef struct OBJECT { + OBJECT_TYPE Type; + volatile long RefCount; + void (*Destroy)(struct OBJECT* self); +} OBJECT; + +// Increments an object's reference count. +__declspec(dllexport) void ObReferenceObject(OBJECT* object); + +// Decrements an object's reference count and destroys it when it reaches zero. +__declspec(dllexport) void ObDereferenceObject(OBJECT* object); + +// Allocates a zeroed object of the given size. +__declspec(dllexport) OBJECT* ObAllocateObject(OBJECT_TYPE type, size_t size); diff --git a/code/public/ntlite/ddk/platform.h b/code/public/ntlite/ddk/platform.h new file mode 100644 index 0000000..5854b22 --- /dev/null +++ b/code/public/ntlite/ddk/platform.h @@ -0,0 +1,23 @@ +// Public nt-lite DDK platform declarations. + +#pragma once + +#include + +// Driver-visible platform services. PCI bus policy stays in pci.sys; these are +// only the raw platform hooks needed by the PCI bus driver itself. +typedef struct NTL_DDK_PLATFORM { + uint32_t (*PciRead32)(uint16_t segment, + uint8_t bus, + uint8_t device, + uint8_t function, + uint16_t offset); + void (*PciWrite32)(uint16_t segment, + uint8_t bus, + uint8_t device, + uint8_t function, + uint16_t offset, + uint32_t value); + uint32_t (*GetBspLapicId)(void); + uint8_t (*IsX2ApicEnabled)(void); +} NTL_DDK_PLATFORM; diff --git a/code/public/ntlite/ddk/scheduler.h b/code/public/ntlite/ddk/scheduler.h new file mode 100644 index 0000000..6fb278f --- /dev/null +++ b/code/public/ntlite/ddk/scheduler.h @@ -0,0 +1,13 @@ +// Public nt-lite DDK scheduler declarations. + +#pragma once + +#include +#include +#include + +// Driver-visible scheduler services. +typedef struct NTL_DDK_SCHEDULER { + KSTATUS (*DelayThread)(uint64_t milliseconds); + void (*Yield)(void); +} NTL_DDK_SCHEDULER; diff --git a/code/public/ntlite/ddk/semaphore.h b/code/public/ntlite/ddk/semaphore.h new file mode 100644 index 0000000..74db887 --- /dev/null +++ b/code/public/ntlite/ddk/semaphore.h @@ -0,0 +1,29 @@ +// Public nt-lite DDK semaphore declarations. + +#pragma once + +#include +#include +#include +#include +#include + +typedef struct SEMAPHORE { + OBJECT Header; + SPINLOCK Lock; + int32_t Count; + int32_t MaxCount; + LIST_ENTRY WaitList; +} SEMAPHORE; + +// Creates a counting semaphore. +__declspec(dllexport) KSTATUS KeSemaphoreCreate(int32_t initial, int32_t max, SEMAPHORE** out); + +// Waits for a semaphore count to become available. +__declspec(dllexport) KSTATUS KeWaitSemaphore(SEMAPHORE* semaphore); + +// Attempts to take a semaphore without blocking. +__declspec(dllexport) KSTATUS KeTrySemaphore(SEMAPHORE* semaphore); + +// Releases one semaphore count. +__declspec(dllexport) void KeSignalSemaphore(SEMAPHORE* semaphore); diff --git a/code/public/ntlite/ddk/settings.h b/code/public/ntlite/ddk/settings.h new file mode 100644 index 0000000..79d7900 --- /dev/null +++ b/code/public/ntlite/ddk/settings.h @@ -0,0 +1,14 @@ +// Public nt-lite DDK settings declarations. + +#pragma once + +#include +#include + +#define KE_SETTINGS_PATH "system\\settings.ini" + +// Reads one string setting from the system settings file. +__declspec(dllexport) KSTATUS KeGetSettingString(const char* section, + const char* key, + char* buffer, + size_t bufferSize); diff --git a/code/public/ntlite/ddk/sync.h b/code/public/ntlite/ddk/sync.h new file mode 100644 index 0000000..d4cb9f0 --- /dev/null +++ b/code/public/ntlite/ddk/sync.h @@ -0,0 +1,86 @@ +// Public nt-lite DDK synchronization declarations. + +#pragma once + +#include +#include +#include +#include + +// Legacy spinlock storage used by current driver-visible objects. +typedef struct SPINLOCK { + volatile long Locked; +} SPINLOCK; + +#define SPINLOCK_INIT { 0 } + +#define KI_SPINLOCK_IRQL_SHIFT ((unsigned)(sizeof(uintptr_t) * 8u - 8u)) +#define KI_SPINLOCK_FLAGS_MASK (~(((uintptr_t)0xFFu) << KI_SPINLOCK_IRQL_SHIFT)) + +// Packs the interrupt flags and prior IRQL into a spinlock cookie. +static __forceinline uintptr_t KiPackSpinlockCookie(uintptr_t flags, KIRQL oldIrql) { + return (flags & KI_SPINLOCK_FLAGS_MASK) | + (((uintptr_t)oldIrql) << KI_SPINLOCK_IRQL_SHIFT); +} + +// Extracts the saved interrupt flags from a spinlock cookie. +static __forceinline uintptr_t KiSpinlockCookieFlags(uintptr_t cookie) { + return cookie & KI_SPINLOCK_FLAGS_MASK; +} + +// Extracts the saved IRQL from a spinlock cookie. +static __forceinline KIRQL KiSpinlockCookieIrql(uintptr_t cookie) { + return (KIRQL)(cookie >> KI_SPINLOCK_IRQL_SHIFT); +} + +// Acquires a spinlock and raises to at least DISPATCH_LEVEL. +static __forceinline uintptr_t KeAcquireSpinlock(SPINLOCK* sl) { + uintptr_t flags = HalDisableInterrupts(); + + KIRQL oldIrql = KeGetCurrentIrql(); + if (oldIrql < DISPATCH_LEVEL) + KeRaiseIrql(DISPATCH_LEVEL); + + while (_InterlockedCompareExchange(&sl->Locked, 1, 0) != 0) + _mm_pause(); + + return KiPackSpinlockCookie(flags, oldIrql); +} + +// Releases a spinlock and restores the caller's saved IRQL and interrupt state. +static __forceinline void KeReleaseSpinlock(SPINLOCK* sl, uintptr_t cookie) { + uintptr_t flags = KiSpinlockCookieFlags(cookie); + KIRQL oldIrql = KiSpinlockCookieIrql(cookie); + + _InterlockedExchange(&sl->Locked, 0); + KeLowerIrql(oldIrql); + HalRestoreInterrupts(flags); +} + +// Attempts to acquire a spinlock without blocking. +static __forceinline int KeTryAcquireSpinlock(SPINLOCK* sl, uintptr_t* outCookie) { + uintptr_t flags = HalDisableInterrupts(); + + KIRQL oldIrql = KeGetCurrentIrql(); + if (oldIrql < DISPATCH_LEVEL) + KeRaiseIrql(DISPATCH_LEVEL); + + if (_InterlockedCompareExchange(&sl->Locked, 1, 0) == 0) { + *outCookie = KiPackSpinlockCookie(flags, oldIrql); + return 1; + } + + KeLowerIrql(oldIrql); + HalRestoreInterrupts(flags); + return 0; +} + +// Acquires a spinlock for DPC-level code. +static __forceinline uintptr_t KeAcquireSpinlockRaiseToDpc(SPINLOCK* sl) { + return KeAcquireSpinlock(sl); +} + +// Releases a spinlock acquired for DPC-level code. +static __forceinline void KeReleaseSpinlockFromDpc(SPINLOCK* sl, uintptr_t cookie) { + KeReleaseSpinlock(sl, cookie); +} diff --git a/code/public/ntlite/ddk/thread.h b/code/public/ntlite/ddk/thread.h new file mode 100644 index 0000000..28187e3 --- /dev/null +++ b/code/public/ntlite/ddk/thread.h @@ -0,0 +1,34 @@ +// Public nt-lite DDK system-thread declarations. + +#pragma once + +#include +#include + +typedef struct THREAD THREAD; + +#ifndef NTL_THREAD_PRIORITY_DEFINED +typedef enum THREAD_PRIORITY { + PriorityLow = 0, + PriorityNormal = 1, + PriorityHigh = 2, + PriorityCount = 3, +} THREAD_PRIORITY; +#define NTL_THREAD_PRIORITY_DEFINED 1 +#endif + +// Creates a system-process kernel thread for a kernel-mode driver. +__declspec(dllexport) KSTATUS KeCreateKernelThread(uintptr_t fn, + uintptr_t arg, + THREAD_PRIORITY priority, + THREAD** out); + +// Creates a system-process kernel thread with an explicit affinity mask. +__declspec(dllexport) KSTATUS KeCreateKernelThreadWithAffinity(uintptr_t fn, + uintptr_t arg, + THREAD_PRIORITY priority, + uint64_t affinityMask, + THREAD** out); + +// Yields the current processor to another runnable thread. +__declspec(dllexport) void KeYield(void); diff --git a/code/public/ntlite/ddk/time.h b/code/public/ntlite/ddk/time.h new file mode 100644 index 0000000..12af6cd --- /dev/null +++ b/code/public/ntlite/ddk/time.h @@ -0,0 +1,13 @@ +// Public nt-lite DDK time declarations. + +#pragma once + +#include +#include +#include + +// Queries the current wall-clock time. +__declspec(dllexport) KSTATUS KeQuerySystemTime(SYS_SYSTEM_TIME* outTime); + +// Queries the current Unix time in seconds. +__declspec(dllexport) uint64_t KeQueryUnixTimeSeconds(void); diff --git a/code/public/ntlite/ddk/timer.h b/code/public/ntlite/ddk/timer.h new file mode 100644 index 0000000..06300d9 --- /dev/null +++ b/code/public/ntlite/ddk/timer.h @@ -0,0 +1,11 @@ +// Public nt-lite DDK timer declarations. + +#pragma once + +#include + +// Driver-visible timing services. +typedef struct NTL_DDK_TIMER { + uint64_t (*QueryTicks)(void); + void (*Stall)(uint32_t microseconds); +} NTL_DDK_TIMER;