일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 수직적 확장
- 고정 IP주소를 가진 네트워크 어댑터를 검색할 수 없습니다.
- 클라우드 제공자
- 가상 프라이빗 클라우드
- VMWare View Connection Serve
- DHCP 설정
- 클라우드 자원 관리자
- 이 컴퓨터는 도메인의 구성원이 아닙니다.
- 도메인 사용자 또는 그룹을 확인할 수 없습니다.
- 수평적 확장
- VMware
- 커뮤니티 클라우드
- 멀티테넌시
- 클라우드 보안 취약성
- 클라우드 서비스 소유자
- 클라우드 소비자
- 정수형 데이터타입
- IT 자원
- View Connection
- dhcp
- 자원 풀링
- 온디맨드식
- Error 1720
- Community Cloud
- 온 프레미스
- 운영관리제어의 축소
- DHCP 설치
- Virtual Private Cloud
- 제한된 이식성
- VMWare vSphere
- Today
- Total
한 걸음씩..
[PCI] 0x0CF8, 0x0CFC 레지스터 사용 본문
PCI Bridge의 특정 register를 수정할 때 사용하였음..
PCI_COMMON_CONFIG를 사용한 방법으로 변경이 되지 않아 아래와 같은 방법을 사용
1. 사용 구조체
#pragma pack(1)
typedef struct _CONFIG_DATA_CHECK
{
union
{
struct
{
int UnUse0 : 1;
int UnUse1 : 1;
int RegisterNumber : 6;
int FunctionNumber : 3;
int DeviceNumber : 5;
int BusNumber : 8;
int Reserved : 7;
int EnableBit : 1;
} nDataBit;
ULONG nData;
} u;
} CONFIG_DATA_CHECK, *PCONFIG_DATA_CHECK;
typedef struct _PCI_DEVICE_NUMBER_INFO
{
ULONG nBus;
ULONG nDevice;
ULONG nFunction;
ULONG nMemory;
} PCI_DEVICE_NUMBER_INFO, *PPCI_DEVICE_NUMBER_INFO;
#pragma pack()
2. Source
PPCI_DEVICE_NUMBER_INFO pDeviceNumberInfo = NULL;
CONFIG_DATA_CHECK ConfigAddressData = { 0, };
//모든 PCI 장치들이 공통적으로 사용하는 Port.
//Read/Write명령어를 보낼 수 있다.
ULONG ConfigAddress = 0x0CF8;
//0x0CF8번지에서 보낸 명령어 (R / W )의 결과.
ULONG ConfigData = 0x0CFC;
ULONG nData = 0;
// IN
pDeviceNumberInfo = (PPCI_DEVICE_NUMBER_INFO) pIrp->AssociatedIrp.SystemBuffer;
if( pDeviceNumberInfo == NULL )
{
ntStatus = STATUS_UNSUCCESSFUL;
pIrp->IoStatus.Information = 0;
}
// Write
ConfigAddressData.u.nDataBit.UnUse0 = 0;
ConfigAddressData.u.nDataBit.UnUse1 = 0;
//64bit 까지만 PCI Common 한 부분이므로 0 ~ 16까지만 사용 가능. ( 4 * 16 = 64 )
ConfigAddressData.u.nDataBit.RegisterNumber = 4; //[ 0x10 ]
ConfigAddressData.u.nDataBit.FunctionNumber = pDeviceNumberInfo->nFunction;
ConfigAddressData.u.nDataBit.DeviceNumber = pDeviceNumberInfo->nDevice;
ConfigAddressData.u.nDataBit.BusNumber = pDeviceNumberInfo->nBus;
ConfigAddressData.u.nDataBit.Reserved = 0;
ConfigAddressData.u.nDataBit.EnableBit = 1;
WRITE_PORT_ULONG( (PULONG)ConfigAddress, ConfigAddressData.u.nData );
WRITE_PORT_ULONG( (PULONG)ConfigData, pDeviceNumberInfo->nMemory);
//Read
ConfigAddressData.u.nDataBit.UnUse0 = 0;
ConfigAddressData.u.nDataBit.UnUse1 = 0;
ConfigAddressData.u.nDataBit.RegisterNumber = 4; //[ 0x10 ]
ConfigAddressData.u.nDataBit.FunctionNumber = pDeviceNumberInfo->nFunction;
ConfigAddressData.u.nDataBit.DeviceNumber = pDeviceNumberInfo->nDevice;
ConfigAddressData.u.nDataBit.BusNumber = pDeviceNumberInfo->nBus;
ConfigAddressData.u.nDataBit.EnableBit = 1;
WRITE_PORT_ULONG( (PULONG)ConfigAddress, ConfigAddressData.u.nData );
nData = READ_PORT_ULONG( (PULONG)ConfigData );
DbgPrint( "0x0CFC : 0x%08X \n", nData );
'프로그래밍' 카테고리의 다른 글
어셈블리어 디버깅 / 윈도우 코드 에러분석, 수정 (0) | 2013.07.15 |
---|---|
PC의 모든 PCI 장치가 사용중인 리소스 정보를 가져오는 방법 (0) | 2013.07.15 |
[MFC]SendInput 사용시 주의 점 (0) | 2013.07.15 |
드라이버 설치할 때 INF 에서 OS 버전 구분하기 (0) | 2013.07.15 |
WIN7 UAC 관련 - 메니페스트 설정 (0) | 2013.07.15 |