임베디드 프로그래밍  

         
전체 기타 | WinCE | Delphi | VisualC | ARM | Media | SE | 마리오네트 | Java | wdm | JTAG | 영상처리 | 인증 | 질문/답변 | H/W | 알고리즘 | Platform | .net | VB | PPC | Network | android | QT | WWW | Linux |
2005/02/14 WDM USB 교육 요약
하창호02-14 17:23 | HIT : 4,974
<WDM USB 교육 요약>

1. USB 지원 OS
- 98 se
- me
- 2000
- xp

2. driver 만들기 위해 필요한 프로그램
- visual studio
- window 2000 ddk
- Compuware DriverStudio (Key: 774C-4CC833-73)

3. architecture
- driver object (최소 2개)
  a. function driver (제작자가 작업 FDO)
  b. bus driver (대부분 os 제공 PDO - 물리적 Device Object)
- device object (Device 마다 하나씩 전역변수 처럼 쓰인다.)
  a. device 들간의 통신은 DDI 방식으로 한다.
  b. device 와의 통신은 IRP 방식으로 한다.

4. 드라이버 로딩 과정
- 장치 검색
- ioCreateDevice 를 이용해서 PDO 메모리 할당
- ioInvalidateDeviceRelation
- PNP 메니져가 리스트 요청
- IRP_MN_QUERY_DEVICE_RELATION
- IRP_MN_QUERY 를 이용해 Report Device ID 요청
- 새 드라이버 탐지 및 inf 파일 요청
- ioCreateDevice 를 이용해서 FDO 메모리 할당
- AddDevice
- ioAttachDEviceToDeviceStack
- IRP_MN_QUERY_RESOURCE_REQUIREMENT
- IRP_MN_START_DEVICE

5. WDM device stacks
- PDO + Lower Filter + FDO + Upper Filter(FIDO)
- IRP 의 흐름: Upper Filter -> FDO -> Lower Filter -> PDO

6. driver의 resource
- Interrupt
- I/O
- Memory
- DMA

7. SoftICE 사용법
- Window 2000 SP4 Patch
- [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTice]
"UsbDisablePopdownTypematic"=dword:00000001
- cmd: net start ntice
- Ctrl + D (디버거 띄우는 키)
- Set Font 2
- Lines 120
- WC 30 (소스창 키우기)
- WD 30 (데이터창 키우기)
- pci (PCI 카드 정보를 읽어옴)
- phys f0000000 (비디오메모리 시작번지를 가지고 물리 번지 알아 냄)
- d bc971000
- e (edit)
- f bc971000 L 4000 ff (화면을 하얗게 칠한다)
- ib 61
- ob 61 ff (스피커에서 소리를 출력한다)

8. 컴파일러 사용법
- 소스파일 작성 HelloDrv.c
#include <NTddk.h>

#define NT_DEVICE_NAME  L"\\Device\\HELLODRV"
#define DOS_DEVICE_NAME L"\\DosDevices\\DOSHELLODRV"

void
HelloDrvUnload(
        IN PDRIVER_OBJECT pDriverObject
        );

NTSTATUS
DriverEntry(
        IN PDRIVER_OBJECT pDriverObject,
        IN PUNICODE_STRING regPath
        )
{
        PDEVICE_OBJECT pDeviceObject = NULL;
        NTSTATUS ntStatus;
        UNICODE_STRING uniNtNameString, uniWin32NameString;


        RtlInitUnicodeString( &uniNtNameString, NT_DEVICE_NAME );
        ntStatus = IoCreateDevice (
                                        pDriverObject,
                    0,                                                        // DeviceExtensionSize
                    &uniNtNameString,
                    FILE_DEVICE_UNKNOWN,                //
                    0,                                                        // No standard device characteristics
                    FALSE,                                                // not exclusive device
                    &pDeviceObject
                    );
        if( !NT_SUCCESS(ntStatus) ) {
                return ntStatus;
        }

        // create dispatch points for create/open, close, unload
        pDriverObject->DriverUnload = HelloDrvUnload;


        RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
        ntStatus = IoCreateSymbolicLink( &uniWin32NameString, &uniNtNameString );
        if (!NT_SUCCESS(ntStatus)){
                IoDeleteDevice( pDriverObject->DeviceObject );
        }

        return ntStatus;
}

void
HelloDrvUnload(
        IN PDRIVER_OBJECT pDriverObject
        )
{
        PDEVICE_OBJECT pDeviceObject;
        UNICODE_STRING uniWin32NameString;


        pDeviceObject = pDriverObject->DeviceObject;

        RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
        IoDeleteSymbolicLink( &uniWin32NameString );
        IoDeleteDevice( pDriverObject->DeviceObject );
}

- build -fwc
- 레지스트리에 다음을 등록
    \registry\machine\system\currentcontrolset\services\HelloDrv
    Type = REG_DWORD 0x00000001
    Start = REG_DWORD 0x00000003
    Group = Extended base
    ErrorControl = REG_DWORD 0x00000001
- C:\WINNT\system32\drivers 에 드라이버 파일을 복사
- net start hellodrv
- net stop hellodrv
- SoftICE: driver hellodrv (드라이버 정보 보기)
- SoftICE: bpx 메모리주소 (브레이크 등록)
- SoftICE: bl (브레이크 포인터 리스트)
- SoftICE: bc * (모든 브레이크 포인터 지우기)
- 시작>SoftICE>Symbol Loader 실행
- Load Symbol 후 Module>Setting 에서 페키지를 심볼테이블과 같이 불러온다는 옵션을 설정 후 재 로딩
- SoftICE: file * (심볼이 올라온 소스 파일을 리스트함)
- SoftICE: file 파일명 (파일을 불러서 뿌림)
- 소스창으로 가서 브레이크 설정
- bl 하면 브레이크된 리스트 보임
- 디버깅 시작
- SoftICE: dd esp (스택을 덤프해서 보여주라)


9  wdm :: Windows NT DDK에 포함된 BulkUsb sample ...  …1  하창호 2005·02·18 5048
8  wdm :: 2005/02/18 WDM USB 교육 요약    하창호 2005·02·18 3992
7  wdm :: DevGURU.com 배포용 U1000 USB 드라이브 및 A...    하창호 2005·02·18 3859
6  wdm :: Windows NT DDK에 포함된 Usbview sample    하창호 2005·02·17 6261
5  wdm :: 2005/02/16 WDM USB 교육 요약    하창호 2005·02·17 4478
4  wdm :: 2005/02/15 WDM USB 교육 요약    하창호 2005·02·17 4226
3  wdm :: Device 정보와 Data 후킹하는 프로그램 크랙버젼    하창호 2005·02·16 7
2  wdm :: WDM USB 교육 샘플 예제  …3  하창호 2005·02·15 4544
 wdm :: 2005/02/14 WDM USB 교육 요약    하창호 2005·02·14 4974
1
   
Copyright 1999-2018 Zeroboard / skin by GGAMBO
....