프로그래밍

    Miniport drivers

    Miniport drivers NDIS 미니포트 드라이버는 두 가지 기본적인 기능을 가지고 있다: NIC를 통해 데이터 송/수신을 포함하는 Netword Interface Card (NIC) 관리. Filter 드라이버, Intermediate 드라이버 그리고 Protocol 드라이버와 같은 상위 레벨 드라이버와의 인터페이싱. 미니포트 드라이버는 NDIS 라이브러리를 통해 NIC와 상위 레벨 드라이버간에 통신을 한다. NDIS 라이브러리는 미니포트 드라이버가 호출 해야 할 모든 운영체제 함수들(NdisMXxx, NdisXxx 함수)을 제공하고 있다. 미니포트 드라이버는 NDIS가 상위 레벨 드라이버를 대신해 미니포트 드라이버에 접근하거나 자체적인 목적을 수행하기 위해 호출 할 경우를 위해 Miniport..

    NDIS 드라이버 유형

    Network Driver Interface Specification (NDIS) 라이브러리는 네트워크 드라이버에서 네트워크 하드웨어들을 추상화한다. 또한 NDIS는 네트워크 전송과 같은 상위 레벨 드라이버들에서 하드웨어를 관리하는 하위 레벨 드라이버들이 추상화 된 네트워크 드라이버 계층 간의 표준 인터페이스를 구체적으로 명시한다. 또한 NDIS는 다른 시스템 값과 연결을 위한 매개변수 블록, 핸들 그리고 함수들에 대한 포인터를 포함하는 매개 변수들과 상태 정보를 유지 관리한다. NDIS가 제공하는 네트워크 드라이버들의 기본적인 유형은 다음과 같다. Miniport Drivers Protocol Drivers Filter Drivers Intermediate Drivers 링크: https://docs...

    visual studio 2017 에서 Driver 개발

    기존에는 Visual Studio에서 드라이버를 개발 할 때 ddkbuild를 사용하여 빌드 환경을 구축 했었다. 하지만 세월이 흘러 Visual Studio 자체에서 드라이버 개발 환경을 제공 해주게 되었다. 새 프로젝트 - Visual C++ - Windows Drivers와 같이 새로운 드라이버 프로젝트를 생성 할 수 있는 방도가 마련되었다. 기본적으로 설치 되지는 않고 확장 기능으로 제공되니 도구→확장 및 업데이트 메뉴에서 Windows Driver Kit을 설치 해줘야 한다. 물론 Visual Studio에서 기존처럼 ddkbuild를 사용해 개발해도 되지만 ARM 환경과 같은 곳에서 동작하는 드라이버를 빌드하려면 해당 기능을 사용해야 하는것이 필수처럼 되었다. 그리하여 ddkbuild, sou..

    MSB8022

    Visual Studio 환경에서 ARM 빌드를 사용 할 경우 MSB8022 Error가 발생 할 수 있다.이에 대한 해결 방법으로 해당 프로젝트 폴더에 들어가 vcxproj 파일을 메모장으로 열어 해당 솔루션 플랫폼에 다음과 같은 구문을 추가한다.true자세한 사항은 이곳의 링크를 참조: https://pete.akeo.ie/2017/05/compiling-desktop-arm-applications-with.html

    IrpSp->FileObject

    https://msdn.microsoft.com/ko-kr/library/windows/hardware/ff548630(v=vs.85).aspx irpsp->fileobject은 I/O Manager가 Create 또는 Open 하는 대상 파일을 가리키기 위한 File Object 형식의 포인터다. File System이 IRP_MJ_CREATE 요청을 처리 할 때, 이 File Object의 FsContext와 FsContext2 필드에는 File System 고유의 값이 셋팅 된다. 따라서 FsContext와 FsContext2 필드의 값들은 File System이 Create 요청을 처리하기 전 까지는 유효하다고 볼 수가 없다. FltCancelFileOpen과 IoCancelFileOpen은 Fi..

    IopLoadUnloadDriver

    VOID NTAPI IopLoadUnloadDriver(PLOAD_UNLOAD_PARAMS LoadParams) { RTL_QUERY_REGISTRY_TABLE QueryTable[3]; UNICODE_STRING ImagePath; UNICODE_STRING ServiceName; NTSTATUS Status; ULONG Type; PDEVICE_NODE DeviceNode; PDRIVER_OBJECT DriverObject; PLDR_DATA_TABLE_ENTRY ModuleObject; PVOID BaseAddress; WCHAR *cur; // 언로드 요청인지 아닌지 검사한다. if (LoadParams->DriverObject) { // 드라이버 로드/언로드에 관련된 파라미터안에 드라이버 객체가..

    NtLoadDriver가 STATUS_PRIVILEGE_NOT_HELD(0xC0000061)를 리턴

    NtLoadDriver()를 사용해서 드라이버를 로드하려고 하는데, 레지스트리 키도 정상적으로 생성했고, 모든 값이 정상적인데도 불구하고 0xC0000061(Privilege not held) 값을 리턴하는 경우에는 권한 문제일 수 있다. 관리자 모드라고 할지라도 몇 Privileges는 기본적으로 Disable일 경우가 있는데 이러한 권한들이 필요한 작업을 하기 위해서는 작업을 수행하기 전에 확실하게 Enable 값으로 설정이 해야한다. NtLoadDriver 같은 경우에는 드라이버를 로드 할 수 있는 권한(SeLoadDriverPrivilege)가 필요하다. 이는 AdjustTokenPrivileges() 함수를 사용해 이 권한을 Enable 시킬 수 있다. 함수의 자세한 사항은 MSDN을 참고하는 ..

    IoCreateDevice와 IoCreateDeviceSecure

    NTSTATUS IoCreateDevice( _In_ PDRIVER_OBJECT DriverObject, _In_ ULONG DeviceExtensionSize, _In_opt_ PUNICODE_STRING DeviceName, _In_ DEVICE_TYPE DeviceType, _In_ ULONG DeviceCharacteristics, _In_ BOOLEAN Exclusive, _Out_ PDEVICE_OBJECT *DeviceObject );NTSTATUS IoCreateDeviceSecure( _In_ PDRIVER_OBJECT DriverObject, _In_ ULONG DeviceExtensionSize, _In_opt_ PUNICODE_STRING DeviceName, _In_ DEVICE_..

    The funny page table terminology on AMD64

    http://www.pagetable.com/?p=14

    vmxon 사용시 주의점

    하이퍼바이저는 vmxon 명령어를 맨 처음으로 실행 해 vmx 를 활성화 해야한다. vmxon 명령어가 실행되면 프로세서가 VMX_ROOT 모드로 진입하게 되는데 이 때 하이퍼바이저가 먼저 확인해야 하는 조건이 있다. - CR4 레지스터의 13번째 bit인 VMXE(0x2000)를 Enable 해야한다. VMXE가 Enable 되지 않은 상태인데 실행하게 되면 #UD(undefined opcode) 예외가 발생된다.- CR0의 NE, PG, PE 모두 VMX_ROOT 모드로 실행되는 동안에 Enable상태로 설정되어 있어야 한다. 만약에 이 비트들이 Clear 되는경우 #GP 예외가 발생된다.- A20M#은 vmxon 을 실행하기 전에 앞서 off 가 되어야 한다. 하이퍼바이저는 vmxon 이 실행되기전..