'똘이'에 해당되는 글 71건

  1. 2013.02.06 리눅스에서 Win32용 어플리케이션 개발하기 by 똘이 임덕규
  2. 2013.01.16 메세지 기법 by 똘이 임덕규
  3. 2013.01.16 NTFS MFT까지의 접근 by 똘이 임덕규
  4. 2013.01.13 CRC16 사용방법 by 똘이 임덕규
  5. 2013.01.08 파일 시스템 요소들 by 똘이 임덕규
  6. 2013.01.08 FAT File System의 구조 by 똘이 임덕규
  7. 2013.01.08 PyGame으로 기본 창 띄우기 by 똘이 임덕규
  8. 2013.01.06 Tkinter 를 이용, 간단한 이미지 뷰어 제작 by 똘이 임덕규
  9. 2013.01.06 Button Module by 똘이 임덕규
  10. 2013.01.05 창 띄우기 by 똘이 임덕규

'Win32 API' 를 이용하여 윈도우용 어플리케이션을 개발하기 위해서는 대부분 Microsoft 사의 Visual Studio를 사용할 것이다. 하지만 현재 사용하고 있는 환경이 리눅스 머신이거나 윈도우라 할지라도 Visual Studio 의 개발환경에 구속되지 않고 개발하기 위해서는 어떻게 할 수 있을까?

몇 가지 방법이 존재하겠지만 여기서 소개하는 방법으로 개발환경을 구성하여 진행해 본다.

  • 저작자 표시
    신고

    '그외' 카테고리의 다른 글

    리눅스에서 Win32용 어플리케이션 개발하기  (0) 2013.02.06

함수포인터를 이용한 유용한 기법중 하나인 “메세지 기법”에 대하서 정리했다.

struct MFT_Entry_Attribute_Type
{
    unsigned short	usNum;
    const char *	cDes;
    void (*fp)(void *);
} MFT_Attr_Type[] = {
    { 16, "$STANDARD_INFORMATION", Content_STD_INFO}
    ,{ 32, "$ATTRIBUTE_LIST",0}
    ,{ 48, "$FILE_NAME",Content_FILE_NAME}
    ,{ 64, "$VOLUME_VERSION or $OBJECT_ID",0}
    ,{ 80, "$SECURITY_DESCRIPTOR",0}
    ,{ 96, "$VOLUME_NAME",0}
    ,{112, "$VOLUME_INFORMATION",0}
    ,{128, "$DATA",0}
    ,{144, "$INDEX_ROOT",0}
    ,{160, "$INDEX_ALLOCATION",0}
    ,{176, "$BITMAP",0}
    ,{192, "$SYMBOLICK_LINK or REPARSE_POINT",0}
    ,{208, "$EA_INFORMATION",0}
    ,{224, "$EA",0}
    ,{256, "$LOGGED_UTILITY_STREAM",0}
    ,{257, "Unknown",0}
};
MFT_Entry_Attribute_Type 구조체는
  • 직접적인 비교에 쓰일 변수 한 개와
  • 메세지 출력을 위한 const char * 형의 변수 한 개,
  • 필요에 따라 함수를 호출할 수 있도록 함수 포인터 선언

으로 이루어져 있으며 소스에서 보는 바와 같이 구조체 선언과 동시에 구조체 배열 변수를 선언해 두었다.


이것을 어떻게 사용하는지 아래 소스에서 살펴보면,

void * test(void *p)            /* 213 페이지 */
{
    struct MFT_Entry_Attribute_Type * stpAttType;

    printf("========================= MFT Entry Attribute Analysis =========================\n");
    printf("Attribute Type                   : ");
    stpAttType = MFT_Attr_Type;
    while(1)
    {
        if(257 == (stpAttType->usNum))
        {
            break;
        }
        else if ((*((U32*)((U8*)p+0))) == stpAttType->usNum) /* 이동은 U8만큼으로 하고 보는건 U32로 보겠다 */
        {
            break;
        }
        ++stpAttType;
    }
    printf("%s\n", stpAttType->cDes);
    printf("Lenth of Attribute               : %dBytes\n", *((U32*)((U8*)p+4))); /* 이 길이를 알아내면 #2의 위치를 알 수 있다. */
    printf("Non-Resident Attribute           : %s\n", 1==(*((U8*)p+8)) ? "Yes":"No");
    printf("Lenth of Name                    : %d\n", *((U8*)p+9));
    printf("Offset to Name                   : %d\n", *((U16*)((U8*)p+10)));
    printf("Attribute Flags                  : ");
    if ( 0 != (0x0001 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Compressed ");
    }
    if ( 0 != (0x4000 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Encrypted ");
    }
    if ( 0 != (0x8000 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Sparse ");
    }
    if ( 0 == (0xC001 & (*((U16*)((U8*)p+12)))) )
    {
        printf("Nothing");
    }
    putchar('\n');
    printf("Attribute Identifier             : 0x%04X\n", *((U16*)((U8*)p+14)));

    if(0==(*((U8*)p+8)))	// Resident Attribute 
    {
        printf("=== Resident Attribute========================\n");
        printf("====== Size of Content           : %d\n", *((U32*)((U8*)p+16)));
        printf("====== Offset to Content         : %d\n", *((U16*)((U8*)p+20)));
        printf("====== Index Flag                : %s\n", 1==(*((U8*)p+22)) ? "Yes":"No");
        printf("====== Padding                   : 0x%02X\n", *((U8*)p+23)); /* Reserve ㅇ */
        printf("==============================================\n");
    }
    else					// Non-Resident Attribute 
    {
    }
	
    if(0!=(stpAttType->fp))     /* 호출 함수가 있다면 호출 한다. */
    {
        (stpAttType->fp)(    (U8*)p + (*((U8*)p+20))     ); /* 함수 포인터 */
    }
    return (U8*)p + (*((U32*)((U8*)p+4))) ;
}
  • 3번 줄에서 위에서 선언한 MFT_Entry_Attribute_Type * stpAttType 포인터 변수 선언
  • 7번에서 전역으로 선언된 MFT_Attr_Type을 stpAttType에 대입
  • 8번줄에서 무한 루프를 돌면서 해당하는 값이 있는지 찾고 없으면 다음 값으로
  • 20번줄에서 해당 메세지를 출력
  • 58번줄에서 함수포인터 사용여부를 검사하여 호출 또는 넘어간다.

위와 같은 기법을 이용하면 메뉴 호출또는 메세지등을 손쉽게 할 수 있다.


저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

pThread를 이용한 Thread  (0) 2013.03.05
Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10








위의 그림은 MBR부터 읽어서 MFT의 Attribute 까지의 접근에 대한 그림이다. 실제 접근까지는 총 세번의 Dump가 이루어지며 Dump시 절대주소를 적어주어야만 원하는 곳의 데이터를 얻을 수 있다.

아래는 위 그림을 설명할 소스코드의 일부분이다.

int main(void)
{
	char dumpData[512];
	U8*  ucP;
	
	HDD_read(1, 0, 1, dumpData); 
	HexDump(dumpData, 512);
	HDD_read(1, *((U32 *)(dumpData + 446 + 8)), 1, dumpData);	// Boot Code + LBA Starting Address
	HexDump(dumpData, 512);
	HDD_read(1, (*((U32*)(dumpData+48))) *8 +63, 1, dumpData); // MFT Entry
	
	ucP = test((dumpData+(*((U16*)(dumpData+20))))); /* Attribute 의 시작 부분 */

 	test(ucP);
	
	return 0;
}

해당 소스의 전체 파일(소스가 제대로 동작하지는 않고 있다.)

hdd_NTFS_MFT_Entry_Attribute.c


저작자 표시
신고

'Embedded > File System' 카테고리의 다른 글

NTFS MFT까지의 접근  (0) 2013.01.16
파일 시스템 요소들  (0) 2013.01.08
FAT File System의 구조  (0) 2013.01.08
FAT 파일 시스템  (0) 2013.01.04
파티션  (0) 2012.12.31

CRC16 사용방법

분류없음 2013.01.13 13:08

다운로드 및 설치

파이썬에서 CRC를 사용하기 위해서는 파이썬 외부 모듈인 crcmod 를 설치해야 한다.

원본주소 - http://pypi.python.org/pypi/crcmod/1.7

2012년 1월 12일자 crcmod 다운로드 하기

crcmod-1.7.tar.gz

다 받았으면 압축을 풀고 관리자 권한으로 설치를 한다.

# python setup.py install


저작자 표시
신고

파일 시스템을 이루고 있는 몇 가지 요소

  • 클러스터
    1. 운영체제가 저장장치에 있는 데이터를 읽고 쓰는 논리적인 기본단위
    2. 리눅스에서는 아이노드라고도 불린다.
    3. 크기가 작은 파일을 저장장치에 쓰고자 하는 경우 파일이 클러스터의 크기보다 작아 서 남는 용량은 버려지게 된다.
    4. 상대적으로 느린 저장 매체인 하드디스크의 속도를 고려하여 1KB 파일을 불러올때 1 KB짜리 클러스트를 열번 불러들이는 것보단 4KB짜리 클러스트를 I/O로 불러들이는 편이 빠르다.
    5. 단 1Byte라도 사용한다면 1개의 클러스터 영역이 사용된다.

하드디스크의 주요 구성 요소

  • 트랙
    1. 디스크의 중심으로 도는 원. 반지름이 커질 수록 원이 커지는 만큼 디스크의 가장자리 영역에 데이터를 많이 보관할 수 있다.
  • 섹터
    1. 각각의 섹터는 571 Byte의 공간을 차지
    2. 그중 59 Byte는 각각의 섹터에서 고유 번호 등을 저장하는 용도로 사용
    3. 나머지 512 Byte가 사용자들이 사용할 수 있는 데이터 영역
  • 실린더
    1. 여러장 겹겹이 있는 플래터 구조를 가지는 하드 디스크에서의 개념으로 수직으로 같은 위치에 있는 섹터들을 실린더라 부른다.


저작자 표시
신고

'Embedded > File System' 카테고리의 다른 글

NTFS MFT까지의 접근  (0) 2013.01.16
파일 시스템 요소들  (0) 2013.01.08
FAT File System의 구조  (0) 2013.01.08
FAT 파일 시스템  (0) 2013.01.04
파티션  (0) 2012.12.31


FAT File System의 구조는 아래와 같이 정리할 수 있다.

  • 부트 레코드(BR)
    1. 크기가 1섹터밖에 안되는 작은 영역
    2. Windows가 FAT 파일시스템을 인식하는 가장 중요한 역할 담당
    3. 이곳이 지워지면 윈도우는 해당 볼륨 인식 불가
  • 예약된(Reserved) 영역
    1. FAT16인 경우에는 1섹터, FAT32 경우에는 32섹터 할당.
  • FAT #1 과 FAT #2
    1. FAT 영역은 클러스트들을 관리하는 테이블이 모여 있는 공간
    2. 이곳에 손상이 가면 심각한 문제가 온다.
    3. FAT #1과 #2는 완전히 똑같은 내용을 가지고 있으며 #2 이상 부터는 만약을 대비해서 만들어둔 백업본이다.
  • 루트 디렉토리 영역(FAT16 에서만 존재)
    1. 위치는 항상 FAT #2 영역 뒤쪽에 고정
    2. 위치는 고정적이지만 크기는 가변적일 수 있다.
  • 데이터 영역
    1. 실제 데이터인 파일과 디렉토리가 클러스트 단위로 저장되어있다.
    2. 섹터 단위가 아닌 클러스터(Cluster)라 불리는 논리적 단위로 읽기 쓰기를 한다.
  • 사용하지 않는 영역
    • FAT File System 볼륨 구조화 과정중 생긴 잉여 영역


저작자 표시
신고

'Embedded > File System' 카테고리의 다른 글

NTFS MFT까지의 접근  (0) 2013.01.16
파일 시스템 요소들  (0) 2013.01.08
FAT File System의 구조  (0) 2013.01.08
FAT 파일 시스템  (0) 2013.01.04
파티션  (0) 2012.12.31

PyGame 라이브러리에서 제공하는 기능을 사용할 수 있는 창을 만들었다. 저기 안에서 그림들이 움직일 것이다.

import pygame, sys
from pygame.locals import *

pygame.init()                   # pygame 초기화
DISPLAYSURF = pygame.display.set_mode((400, 300)) # 화면크기 설정
pygame.display.set_caption('Hello World')         # 윈도우 타이틀 설정

while True:
    for event in pygame.event.get(): # 입력에 대한 이벤트가 있을 경우
        if event.type == QUIT:       # 종료시 입력시
            pygame.quit()            # pygame을 종료한 후
            sys.exit()               # 프로그램 종료
        pygame.display.update()      # 화면 갱신

  • Pygame.init()
    • 모듈 가져오기 이후 꼭 불러와야 할 초기화 함수
    • 이 함수가 무엇을 하는지는 우리가 알 필요는 없다.
  • DISPLAYSURF = pygame.display.set_mode((400, 300))
    • pygame.display.set_mode()는 pygmae.Surface 객체를 반환한다.
    • 터플형으로 들어있을 두 개의 정수는 픽셀 단위로 창의 가로, 세로 길이를 정한다.
    • 터플형으로 들어가 있어야 함을 잊지 말자.
  • 프로그램을 실행 및 지속 시키는 유일한 방법은 while loop로 프로그램을 두는 것이다.
    • 실행중인 프로그램에서 나가는 방법은 break문을 동작하게 만들어 두는 것이다.
    • 이것은 main game loop또는 main loop라 불리고 아래의 일들을 하게된다.
      • 이벤트 처리
      • 게임 상태 갱신
      • 게임 화면을 그린다.
    • 아래와 같은 순환 구조를 가진다

    • for event in pygame.event.get():
      • 이벤트 함수가 for문에 원소들을 event에 대입 시키며 루프가 해당 이벤트가 있었는지 검사하게 되는데, pygame.event.get()은 입력 받은 값을 내보내고 있는것이다.
      • 이벤트가 일어나지 않으면 빈 리스트가 돌게된다.
    • sys.exit()함수를 부르기 전에 반드시 pygame.quit()를 실행하여 라이브러리를 올바로 종료시킨 다음 프로그램을 마친다.
    • pygame.display.update()
      • Surface 객체(화면)에 저장되어있는 바뀐 화면을 뿌린다.


저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

PyGame으로 기본 창 띄우기  (0) 2013.01.08
Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
TAG pygame, Python


앞서 잠시 살펴보고 버릴려고 했던 Tk 로 그래도 간단하게나마 뭔가 만들어나 볼까 해서 나온게 사진을 불러 올 수 있는 버튼과 사진크기 출력해주는 라벨만 가져다 붙였다.


디자이너 같은게 있다고 들었지만 딱히 파고들 만한게 아니였기 때문에 다른 툴은 사용하지 않았다. 이런 GUI 만들때는 무조건 디자이너 툴을 사용하는게 맞다는 생각이 든다.

# coding: utf-8
"""
Tkinter 와 media 모듈을 이용, 간단한 이미지 뷰어
버튼을 눌러 파일을 선택 및 이미지로 불러온 다음, 새창에 출력
메인 윈도우에는 이미지의 크기를 출력 
"""

from Tkinter import *
import media

class mainUI():
    def __init__(self, parent): # 생성자 시작
        self.parent = parent    

        # 라벨 값 변경을 위한 객체 선언
        self.picWidth = StringVar()
        self.picHeight = StringVar()
        
        self.initUI()
        
    def initUI(self):
        self.parent.title("Raven") # 메인 윈도우 타이틀 설정
        self.buttonLoadFile = Button(self.parent, # 부모 윈도우 설정
                                     text = "파일 불러오기", # 버튼 타이틀
                                     command = self.loadFile) # 클릭시 불러올 함수
        self.buttonLoadFile.place(x = 20, y = 10)

        # Label for height
        self.labelHeight = Label(self.parent, text = "Height : ") # 라벨 설정
        self.labelHeight.place(x = 20, y = 50) # 라벨 좌표
        self.labelInfoHeight = Label(self.parent, textvariable = self.picHeight) # 값 출력을 위한 라벨
        
        # Label for Width
        self.labelWidth = Label(self.parent, text = "Width : ")
        self.labelWidth.place(x = 20, y = 80)
        self.labelInfoWidth = Label(self.parent, textvariable = self.picWidth)

    def loadFile(self):
        self.pic_file = media.load_picture(media.choose_file()) # 파일을 선택하고 이미지로 불러들여서 객체화
        media.show(self.pic_file)                               # 이미지를 새창에 출력
        self.showInfo()                                         # 이미지 정보 출력을 위한 메소드콜
    
    def showInfo(self):
        self.picHeight.set(media.get_height(self.pic_file)) # Height
        self.labelInfoHeight.place(x = 80, y = 50)

        self.picWidth.set(media.get_width(self.pic_file)) # Width
        self.labelInfoWidth.place(x = 80, y = 80)

    # def loadFile(self):
    #     self.C = Canvas(self.parent)        
    #     self.pic_file = PhotoImage(file = media.choose_file())
    #     self.image = self.C.create_image(0, 
    #                                      0, 
    #                                      image = self.pic_file)
    #     self.C.pack()

def main():
    mainWindow = Tk()
    mainWindow.geometry("300x150+300+300") # 메인 윈도우의 창크기와 위치
    app = mainUI(mainWindow)
    mainWindow.mainloop()

if __name__ == "__main__":
    main()

저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

PyGame으로 기본 창 띄우기  (0) 2013.01.08
Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
TAG GUI, Python, TK, Tkinter


윈도우에 버튼을 추가하여 버튼의 이벤트로 글씨나 그림 또는 그림과 같이 메세지박스를 띄울 수 있다. 사용법은 아래와 같다.
button1 = Tkinter.Button(부모객체, 옵션명="")
button1 = Tkinter(top, text="hello")
버튼이라는 객체를 생성시 top을 부모 윈도우로 지정, hello라고 적힌 버튼을 만든다.

옵션

위 그림의 소스

# coding: utf-8
import Tkinter
import tkMessageBox             # 메세지 박스 모듈

top = Tkinter.Tk()

def helloCallBack():                      
   tkMessageBox.showinfo( "Hello Python", # 메세지박스 타이틀
                          "Hello World")  # 메세지 박스 내용

B = Tkinter.Button(top,         # 부모 객체
                   text ="Hello", # 버튼에 들어갈 텍스트
                   command = helloCallBack) # 호출할 함수

B.pack()
top.mainloop()

여기에 옵션을 넣어서 만든 버튼 예제.

위 버튼은 아래의 소스에 옵션들과 함께 정리해 두었다. 사용법을 알 수 없었던 Image 옵션은 나중에 알게되면 따로 수정.

# coding: utf-8
import Tkinter, Image, ImageTk
import tkMessageBox

top = Tkinter.Tk()

def helloCallBack():
   tkMessageBox.showinfo( "Hello Python", # 메세지박스 타이틀
                          "Hello World")  # 메세지 박스 내용

B = Tkinter.Button(top,         # 부모 객체
                   text = "Hello\nWorld", # 버튼에 들어갈 텍스트
                   activebackground = "Khaki", # 마우스가 위에 있을때 버튼 색
                   activeforeground = "red",   # 마우스가 위에 있을때 글자 색
                   bd = "5",                   # 버튼의 테두리 두께
                   bg = "yellow",               # 버튼의 평상시 배경 색
                   fg = "blue",                 # 버튼의 평상시 글자 색
                   font = ("verdana", "10"),            # 버튼의 글꼴
                   
                   height = "5",                        # 버튼의 크기
                   width = "10",                        
                   
                   highlightcolor = "black",
                   justify = "right", # 버튼의 글이 여러줄일때 어느쪽으로 맞출지 정함
                   # center, right, left
                   padx = "10",       # 간격
                   pady = "10",
                   relief = "ridge",        # 버튼 기본 모양
                   # sunken, raised, groove, ridge
                   
                   state = "active",      # 버튼을 사용, 또는 사용안함
                   #active (비활성화 모양이지만 사용할 수 있음), disable, normal

                   underline = "3",         # 4번째 글자에 밑줄
                   wraplength = "40",       # 글씨를 안보이는 가상 상자안에 싼다
                   
                   command = helloCallBack) # 호출할 함수

B.pack()
top.mainloop()
저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

PyGame으로 기본 창 띄우기  (0) 2013.01.08
Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03

# coding: utf-8

import Tkinter                  # Tkinter 모듈 가져오기

top = Tkinter.Tk()              # top 객체 생성

top.mainloop()                  # mainloop() 메소드 실행으로 창을 띄운다.

저작자 표시
신고

'컴퓨터 언어 > Python' 카테고리의 다른 글

Tkinter 를 이용, 간단한 이미지 뷰어 제작  (0) 2013.01.06
Button Module  (0) 2013.01.06
창 띄우기  (0) 2013.01.05
media 모듈을 이용한 이미지 띄우기  (0) 2013.01.05
파이썬 학습과제 - 1  (0) 2012.10.03
파이썬 실행 해보기  (0) 2012.09.28
TAG GUI, pytk, TK, Tkinter


티스토리 툴바