반응형




DB에서 얻어오는 필요한 데이터필드는 일단 정의해 두고, hidden으로 보이지 않게 한다.
이후에 load 완료시 색깔을 변경하거나 값을 변경할 수 있다.

+ 셀 데이터값에 따라 줄 색깔 변경하기 ; setRowData
   jqGrid(... ) 내부에 아래 콜백을 추가한다.

   , loadComplete : function() {
             var ids = $("#curlist").getDataIDs() ;
             $.each( ids, function(idx, rowId) {
                            rowData = $("#curlist").getRowData(rowId) ;
                          if ( rowData.RESULT == rowData.RESULTHU ) {
                          } else {
                                   // 색깔 변경하기
                               $("#curlist").setRowData(rowId, false, {background:"#ff0000"}) ;
                          }
                       }
                 ) ;             
        }


+ 셀 값 변경하기 ; setCell or formatter
(필드명 그대로 사용하지 않고, 다른 필드의 조합으로 해당 값을 만들 경우)
필요한 필드들을 일단 가져오고, hidden으로 해 두고, 실제 사용할 필드명을 정의해서 afterInsertRow나 loadComplete에서
처리해 준다.

    $("#reglist").jqGrid({ 
        //ajax 호출할 페이지
        url:'GetRegSign',
        //로딩중일때 출력시킬 로딩내용
        loadtext : '로딩중..',
        //응답값
        datatype: "json",
        mtype : 'POST',
        postData:{},
        height: 250,
        colNames:['ID','등록일', 'TotalCnt','OkCnt', 'FailCnt','Total'],
        colModel:[
            {name:'SIGNID', width:'270'},
            {name:'REGDATE', formatter:function(cellvalue, options, rowobj){
                 return dateconverthu(cellvalue) ;
            }},
            {name:'AUTHCNT', width:'50', hidden:true},
            {name:'AUTHOKCNT', width:'50', hidden:true},
            {name:'AUTHFAILCNT', width:'50', hidden:true},
            {name:'TOTAL', width:'50'}
            ],
        caption: "등록서명",

loadComplete : function() {
             var ids = $("#reglist").getDataIDs() ;
             $.each(ids, function(idx, rowId) {
                            rowData = $("#reglist").getRowData(rowId) ;
                            if ( !rowData.AUTHCNT ) rowData.AUTHCNT="0" ;
                            if ( !rowData.AUTHOKCNT ) rowData.AUTHOKCNT="0" ;
                            if ( !rowData.AUTHFAILCNT ) rowData.AUTHFAILCNT="0" ;
                              // 셀 값 설정하기
                            $("#reglist").setCell(rowId, 'TOTAL', rowData.AUTHCNT
                   +" ("+rowData.AUTHOKCNT+"/"+rowData.AUTHFAILCNT+")") ;
                       }
                 ) ;
        }






'Develop > Java' 카테고리의 다른 글

CentOS, tomcat 타임존 문제  (2) 2018.03.06
tomcat 외부라이브러리 경로 설정 및 톰캣 튜닝  (0) 2018.03.06
jqGrid (1)  (0) 2016.01.19
한글 인코딩 UTF8  (0) 2015.06.02
tomcat에서 한글 인코딩 UTF8기준  (0) 2015.06.02
반응형

++ jqgrid
jQueryUI  ; jquery를 이용한 UI  프레임워크.
위 사이트에서 gallery탭에 원하는 테마를 선택하고, 다운로드한다. 페이지 이동되면 맨 밑에 다운로드버튼 있음.

jqGrid ; 플러그인. 대량의 데이터를 테이블로 웹에 표현시 사용. jQuery로 된 플러그인임.
          ajax 기반 자바스크립트 컨트롤러, jquery-ui를 이용.
     페이징, 정렬 등의 기능 제공.

+ 사용 방법

1. webcontent 폴더 내부에 jqgrid 폴더 생성, jqueryui 폴더 생성
jqgrid, jqueryui 압축 파일을 풀어서 위 생성한 폴더로 복사.

2. 연결

-jsp 페이지에 다음과 같이 코딩.

< script src ="js/jquery-1.11.0.js"></script >
<!-- jqGrid 연동코드 -->
<link rel="stylesheet" type="text/css" media="screen"
       href="jqueryui/jquery-ui.css" />
<link rel="stylesheet" type="text/css" media="screen"
       href="jqgrid/css/ui.jqgrid.css" />
<!--
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
 -->
<script src="jqueryui/jquery-ui.js" ></script>
<script src="jqgrid/js/jquery.jqGrid.min.js" ></script>
<!--  -->

 헤더부에 위와 같이 필요한 js를 로딩하도록 한다.


<script>
$(function(){
    $("#loglist").jqGrid({ 
        //ajax 호출할 페이지
        url: 'GetLog',
        //로딩중일때 출력시킬 로딩내용
        loadtext : '로딩중..',
        //응답값
        datatype: "json",
        mtype : 'POST',
        postData:{},
        height: 250,
        colNames:[ 'ID','등록일' , '등록자' , '장치' , '데이터' ],
        colModel:[
            {name: 'LOGID'},
            {name: 'REGDATE'},
            {name: 'MOBILE'},
            {name: 'REGDEVTYPE'},
            {name: 'DATA', hidden:true }
        ],
        caption: "로그"
    });
});
</script>

<div id="divloglist">
       <table id= "loglist">
       </table>
</div>

위 ajax로 된 GetLog URL은 servlet으로 DB조회 데이터를 json 형태로 위 colModel에 나온 name의  필드명으로 데이터가 조회되도록 한다.




+ 레코드(라인)row 불러오기
-----------------------------------------------------------------------------------
(1) 단일 Row 일 경우 선택하여 값을 불러오기
 var obj = $("#ListTable");
var rowId = obj.jqGrid("getGridParam", "selrow");
var value = obj.jqGrid('getCell', rowId, 'ColumnName');
alert(value);
 
(2) MultiSelect 다중 Row 일 경우 값 출력 해보기
var obj = $("#ListTable");
var idx = obj .jqGrid('getGridParam', 'selarrrow');
 
for(var i = 0; i < idx.length;i++)
{
var value = obj.jqGrid('getCell', idx[i], ''ColumnName’);
alert(value);
}
-----------------------------------------------------------------------------------


++ 멀티 셀렉트 된 결과 가져오기
-----------------------------------------------------------------------------------

$("#OutputGrid").getGridParam('selarrrow');
를 사용 현재선택되어진 로우의 id값을 가져올수 있다.
리턴값은 Array
var ids = $("#OutputGrid").jqGrid('getDataIDs');
는 전체 로우의 id값을 가져온다      

루프를 돌면서 id값을 비교하여 존재한다면 선택된어진 로우이고 없다면 선택 안 된 로우이다.


function setErp() {
        var message = "";
        var id = $("#OutputGrid").getGridParam('selarrrow');
        var ids = $("#OutputGrid").jqGrid('getDataIDs');
        var dat = "";
        var count = 0;

// 이렇게 하거나
        for (var i = 0; i < ids.length; i++) {
            var check = false;
            $.each(id, function (index, value) {
                if (value == ids[i])
                    check = true;
            });
            if (check) {
                var rowdata = $("#OutputGrid").getRowData(ids[i]);
                dat += rowdata.ORDER_CD + ',' + rowdata.ORDER_SEQ + '/';
                count++;
            }
        }
// 또는 이렇게 간단하게.
$.each(id, function(index,value) {
var rowdata = $("#OutputGrid").getRowData(value) ;
dat += rowData.ORDER_CD+','+rowdata.ORDER_SEQ+'/';
count++ ;
}) ;


     $("#strOrder").val(dat);
     $("form").submit();
 }


* jqgrid multi select option 처리 multiselect: true

jQuery("#OutputGrid").jqGrid({
        url: ''      
datatype: 'json',
        mtype: 'POST',
        height: 500,
        rowNum: 0,
        hidegrid: false,
        rowList: [10, 20, 30],
        altRows: true,
        altclass: 'EvenRowClass',
        colNames: [1, 2, 3, 4, 5, 6],
        colModel: [
        { name: 'CUSTOMER_CD', index: 'CUSTOMER_CD', width: 80, sortable: false, align: 'center' },
        { name: 'NAME', index: 'NAME', width: 70, sortable: false, align: 'center' },
        { name: 'KIND_NM', index: 'KIND_NM', width: 30, sortable: false, align: 'center' },
        { name: 'MODEL_NM', index: 'MODEL_NM', width: 130, sortable: false, align: 'left' },
        { name: 'ORDER_CD', index: 'ORDER_CD', width: 1, sortable: false, align: 'center', hidden : true },
        { name: 'ORDER_SEQ', index: 'ORDER_SEQ', width: 1, sortable: false, align: 'center', hidden: true }
        ],
        viewrecords: true,
        multiselect: true
    });







반응형


windows 10 64bit


윈도우 10에서 사용되는 커널 자료 구조를 알려면....


1. 일단 디버거. windbg를 설치해야 되는데, 

https://msdn.microsoft.com/ko-kr/windows/hardware/dn913721.aspx

위 사이트로 가서 WDM 10 설치하면 디버거가 깔린다.


2. 필요한 심볼..

https://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx

위 사이트 가서 필요한 심볼 압축파일을 받아 설치한다.

3. 디버거에 심볼 설정.

ctrl+s 하고 심볼 경로에 아래 기록. e:\symbols는 본인이 설치한 심볼 경로로 변경.

SRV*e:\symbols*http://msdl.microsoft.com/download/symbols

reload 체크하여 확인.


4. 메뉴에서 중요하지 않은 프로세스나 attach하여 심볼 확인.

F6 - 중요하지 않은 임의의 프로세스(notepad.exe 등) 선택


5. 필요한 자료구조 조회


주의!!! build 1511에서 약간 변경변경되에 뒤에 추가하였음


0:032> dt _EPROCESS

ntdll!_EPROCESS

   +0x000 Pcb              : _KPROCESS

   +0x2d8 ProcessLock      : _EX_PUSH_LOCK

   +0x2e0 RundownProtect   : _EX_RUNDOWN_REF

   +0x2e8 UniqueProcessId  : Ptr64 Void

   +0x2f0 ActiveProcessLinks : _LIST_ENTRY

   +0x300 Flags2           : Uint4B

   +0x300 JobNotReallyActive : Pos 0, 1 Bit

   +0x300 AccountingFolded : Pos 1, 1 Bit

   +0x300 NewProcessReported : Pos 2, 1 Bit

   +0x300 ExitProcessReported : Pos 3, 1 Bit

   +0x300 ReportCommitChanges : Pos 4, 1 Bit

   +0x300 LastReportMemory : Pos 5, 1 Bit

   +0x300 ForceWakeCharge  : Pos 6, 1 Bit

   +0x300 CrossSessionCreate : Pos 7, 1 Bit

   +0x300 NeedsHandleRundown : Pos 8, 1 Bit

   +0x300 RefTraceEnabled  : Pos 9, 1 Bit

   +0x300 DisableDynamicCode : Pos 10, 1 Bit

   +0x300 EmptyJobEvaluated : Pos 11, 1 Bit

   +0x300 DefaultPagePriority : Pos 12, 3 Bits

   +0x300 PrimaryTokenFrozen : Pos 15, 1 Bit

   +0x300 ProcessVerifierTarget : Pos 16, 1 Bit

   +0x300 StackRandomizationDisabled : Pos 17, 1 Bit

   +0x300 AffinityPermanent : Pos 18, 1 Bit

   +0x300 AffinityUpdateEnable : Pos 19, 1 Bit

   +0x300 PropagateNode    : Pos 20, 1 Bit

   +0x300 ExplicitAffinity : Pos 21, 1 Bit

   +0x300 ProcessExecutionState : Pos 22, 2 Bits

   +0x300 DisallowStrippedImages : Pos 24, 1 Bit

   +0x300 HighEntropyASLREnabled : Pos 25, 1 Bit

   +0x300 ExtensionPointDisable : Pos 26, 1 Bit

   +0x300 ForceRelocateImages : Pos 27, 1 Bit

   +0x300 ProcessStateChangeRequest : Pos 28, 2 Bits

   +0x300 ProcessStateChangeInProgress : Pos 30, 1 Bit

   +0x300 DisallowWin32kSystemCalls : Pos 31, 1 Bit

   +0x304 Flags            : Uint4B

   +0x304 CreateReported   : Pos 0, 1 Bit

   +0x304 NoDebugInherit   : Pos 1, 1 Bit

   +0x304 ProcessExiting   : Pos 2, 1 Bit

   +0x304 ProcessDelete    : Pos 3, 1 Bit

   +0x304 ControlFlowGuardEnabled : Pos 4, 1 Bit

   +0x304 VmDeleted        : Pos 5, 1 Bit

   +0x304 OutswapEnabled   : Pos 6, 1 Bit

   +0x304 Outswapped       : Pos 7, 1 Bit

   +0x304 FailFastOnCommitFail : Pos 8, 1 Bit

   +0x304 Wow64VaSpace4Gb  : Pos 9, 1 Bit

   +0x304 AddressSpaceInitialized : Pos 10, 2 Bits

   +0x304 SetTimerResolution : Pos 12, 1 Bit

   +0x304 BreakOnTermination : Pos 13, 1 Bit

   +0x304 DeprioritizeViews : Pos 14, 1 Bit

   +0x304 WriteWatch       : Pos 15, 1 Bit

   +0x304 ProcessInSession : Pos 16, 1 Bit

   +0x304 OverrideAddressSpace : Pos 17, 1 Bit

   +0x304 HasAddressSpace  : Pos 18, 1 Bit

   +0x304 LaunchPrefetched : Pos 19, 1 Bit

   +0x304 Background       : Pos 20, 1 Bit

   +0x304 VmTopDown        : Pos 21, 1 Bit

   +0x304 ImageNotifyDone  : Pos 22, 1 Bit

   +0x304 PdeUpdateNeeded  : Pos 23, 1 Bit

   +0x304 VdmAllowed       : Pos 24, 1 Bit

   +0x304 ProcessRundown   : Pos 25, 1 Bit

   +0x304 ProcessInserted  : Pos 26, 1 Bit

   +0x304 DefaultIoPriority : Pos 27, 3 Bits

   +0x304 ProcessSelfDelete : Pos 30, 1 Bit

   +0x304 SetTimerResolutionLink : Pos 31, 1 Bit

   +0x308 CreateTime       : _LARGE_INTEGER

   +0x310 ProcessQuotaUsage : [2] Uint8B

   +0x320 ProcessQuotaPeak : [2] Uint8B

   +0x330 PeakVirtualSize  : Uint8B

   +0x338 VirtualSize      : Uint8B

   +0x340 SessionProcessLinks : _LIST_ENTRY

   +0x350 ExceptionPortData : Ptr64 Void

   +0x350 ExceptionPortValue : Uint8B

   +0x350 ExceptionPortState : Pos 0, 3 Bits

   +0x358 Token            : _EX_FAST_REF

   +0x360 WorkingSetPage   : Uint8B

   +0x368 AddressCreationLock : _EX_PUSH_LOCK

   +0x370 PageTableCommitmentLock : _EX_PUSH_LOCK

   +0x378 RotateInProgress : Ptr64 _ETHREAD

   +0x380 ForkInProgress   : Ptr64 _ETHREAD

   +0x388 CommitChargeJob  : Ptr64 _EJOB

   +0x390 CloneRoot        : _RTL_AVL_TREE

   +0x398 NumberOfPrivatePages : Uint8B

   +0x3a0 NumberOfLockedPages : Uint8B

   +0x3a8 Win32Process     : Ptr64 Void

   +0x3b0 Job              : Ptr64 _EJOB

   +0x3b8 SectionObject    : Ptr64 Void

   +0x3c0 SectionBaseAddress : Ptr64 Void

   +0x3c8 Cookie           : Uint4B

   +0x3d0 WorkingSetWatch  : Ptr64 _PAGEFAULT_HISTORY

   +0x3d8 Win32WindowStation : Ptr64 Void

   +0x3e0 InheritedFromUniqueProcessId : Ptr64 Void

   +0x3e8 LdtInformation   : Ptr64 Void

   +0x3f0 OwnerProcessId   : Uint8B

   +0x3f8 Peb              : Ptr64 _PEB

   +0x400 Session          : Ptr64 Void

   +0x408 AweInfo          : Ptr64 Void

   +0x410 QuotaBlock       : Ptr64 _EPROCESS_QUOTA_BLOCK

   +0x418 ObjectTable      : Ptr64 _HANDLE_TABLE

   +0x420 DebugPort        : Ptr64 Void

   +0x428 Wow64Process     : Ptr64 Void

   +0x430 DeviceMap        : Ptr64 Void

   +0x438 EtwDataSource    : Ptr64 Void

   +0x440 PageDirectoryPte : Uint8B

   +0x448 ImageFileName    : [15] UChar

   +0x457 PriorityClass    : UChar

   +0x458 SecurityPort     : Ptr64 Void

   +0x460 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO

   +0x468 JobLinks         : _LIST_ENTRY

   +0x478 HighestUserAddress : Ptr64 Void

   +0x480 ThreadListHead   : _LIST_ENTRY

   +0x490 ActiveThreads    : Uint4B

   +0x494 ImagePathHash    : Uint4B

   +0x498 DefaultHardErrorProcessing : Uint4B

   +0x49c LastThreadExitStatus : Int4B

   +0x4a0 PrefetchTrace    : _EX_FAST_REF

   +0x4a8 LockedPagesList  : Ptr64 Void

   +0x4b0 ReadOperationCount : _LARGE_INTEGER

   +0x4b8 WriteOperationCount : _LARGE_INTEGER

   +0x4c0 OtherOperationCount : _LARGE_INTEGER

   +0x4c8 ReadTransferCount : _LARGE_INTEGER

   +0x4d0 WriteTransferCount : _LARGE_INTEGER

   +0x4d8 OtherTransferCount : _LARGE_INTEGER

   +0x4e0 CommitChargeLimit : Uint8B

   +0x4e8 CommitCharge     : Uint8B

   +0x4f0 CommitChargePeak : Uint8B

   +0x4f8 Vm               : _MMSUPPORT

   +0x5f0 MmProcessLinks   : _LIST_ENTRY

   +0x600 ModifiedPageCount : Uint4B

   +0x604 ExitStatus       : Int4B

   +0x608 VadRoot          : _RTL_AVL_TREE

   +0x610 VadHint          : Ptr64 Void

   +0x618 VadCount         : Uint8B

   +0x620 VadPhysicalPages : Uint8B

   +0x628 VadPhysicalPagesLimit : Uint8B

   +0x630 AlpcContext      : _ALPC_PROCESS_CONTEXT

   +0x650 TimerResolutionLink : _LIST_ENTRY

   +0x660 TimerResolutionStackRecord : Ptr64 _PO_DIAG_STACK_RECORD

   +0x668 RequestedTimerResolution : Uint4B

   +0x66c SmallestTimerResolution : Uint4B

   +0x670 ExitTime         : _LARGE_INTEGER

   +0x678 InvertedFunctionTable : Ptr64 _INVERTED_FUNCTION_TABLE

   +0x680 InvertedFunctionTableLock : _EX_PUSH_LOCK

   +0x688 ActiveThreadsHighWatermark : Uint4B

   +0x68c LargePrivateVadCount : Uint4B

   +0x690 ThreadListLock   : _EX_PUSH_LOCK

   +0x698 WnfContext       : Ptr64 Void

   +0x6a0 Spare0           : Uint8B

   +0x6a8 SignatureLevel   : UChar

   +0x6a9 SectionSignatureLevel : UChar

   +0x6aa Protection       : _PS_PROTECTION

   +0x6ab HangCount        : UChar

   +0x6ac Flags3           : Uint4B

   +0x6ac Minimal          : Pos 0, 1 Bit

   +0x6ac ReplacingPageRoot : Pos 1, 1 Bit

   +0x6ac DisableNonSystemFonts : Pos 2, 1 Bit

   +0x6ac AuditNonSystemFontLoading : Pos 3, 1 Bit

   +0x6ac Crashed          : Pos 4, 1 Bit

   +0x6ac JobVadsAreTracked : Pos 5, 1 Bit

   +0x6ac VadTrackingDisabled : Pos 6, 1 Bit

   +0x6ac AuxiliaryProcess : Pos 7, 1 Bit

   +0x6ac SubsystemProcess : Pos 8, 1 Bit

   +0x6ac IndirectCpuSets  : Pos 9, 1 Bit

   +0x6ac InPrivate        : Pos 10, 1 Bit

   +0x6b0 DeviceAsid       : Int4B

   +0x6b8 SvmData          : Ptr64 Void

   +0x6c0 SvmProcessLock   : _EX_PUSH_LOCK

   +0x6c8 SvmLock          : Uint8B

   +0x6d0 SvmProcessDeviceListHead : _LIST_ENTRY

   +0x6e0 LastFreezeInterruptTime : Uint8B

   +0x6e8 DiskCounters     : Ptr64 _PROCESS_DISK_COUNTERS

   +0x6f0 PicoContext      : Ptr64 Void

   +0x6f8 TrustletIdentity : Uint8B

   +0x700 KeepAliveCounter : Uint4B

   +0x704 NoWakeKeepAliveCounter : Uint4B

   +0x708 HighPriorityFaultsAllowed : Uint4B

   +0x710 EnergyValues     : Ptr64 _PROCESS_ENERGY_VALUES

   +0x718 VmContext        : Ptr64 Void

   +0x720 Silo             : Ptr64 _ESILO

   +0x728 SiloEntry        : _LIST_ENTRY

   +0x738 SequenceNumber   : Uint8B

   +0x740 CreateInterruptTime : Uint8B

   +0x748 CreateUnbiasedInterruptTime : Uint8B

   +0x750 TotalUnbiasedFrozenTime : Uint8B

   +0x758 LastAppStateUpdateTime : Uint8B

   +0x760 LastAppStateUptime : Pos 0, 61 Bits

   +0x760 LastAppState     : Pos 61, 3 Bits

   +0x768 SharedCommitCharge : Uint8B

   +0x770 SharedCommitLock : _EX_PUSH_LOCK

   +0x778 SharedCommitLinks : _LIST_ENTRY

   +0x788 AllowedCpuSets   : Uint8B

   +0x790 DefaultCpuSets   : Uint8B

   +0x788 AllowedCpuSetsIndirect : Ptr64 Uint8B

   +0x790 DefaultCpuSetsIndirect : Ptr64 Uint8B

------------------------------------------------------------------------
Windows 10 x64, build 1511 버전에서는 위 커널 자료구조가 약간 바뀌었다.

---------

kd> dt _EPROCESS
nt!_EPROCESS
   +0x000 Pcb              : _KPROCESS
   +0x2d8 ProcessLock      : _EX_PUSH_LOCK
   +0x2e0 RundownProtect   : _EX_RUNDOWN_REF
   +0x2e8 UniqueProcessId  : Ptr64 Void
   +0x2f0 ActiveProcessLinks : _LIST_ENTRY
   +0x300 Flags2           : Uint4B
   +0x300 JobNotReallyActive : Pos 0, 1 Bit
   +0x300 AccountingFolded : Pos 1, 1 Bit
   +0x300 NewProcessReported : Pos 2, 1 Bit
   +0x300 ExitProcessReported : Pos 3, 1 Bit
   +0x300 ReportCommitChanges : Pos 4, 1 Bit
   +0x300 LastReportMemory : Pos 5, 1 Bit
   +0x300 ForceWakeCharge  : Pos 6, 1 Bit
   +0x300 CrossSessionCreate : Pos 7, 1 Bit
   +0x300 NeedsHandleRundown : Pos 8, 1 Bit
   +0x300 RefTraceEnabled  : Pos 9, 1 Bit
   +0x300 DisableDynamicCode : Pos 10, 1 Bit
   +0x300 EmptyJobEvaluated : Pos 11, 1 Bit
   +0x300 DefaultPagePriority : Pos 12, 3 Bits
   +0x300 PrimaryTokenFrozen : Pos 15, 1 Bit
   +0x300 ProcessVerifierTarget : Pos 16, 1 Bit
   +0x300 StackRandomizationDisabled : Pos 17, 1 Bit
   +0x300 AffinityPermanent : Pos 18, 1 Bit
   +0x300 AffinityUpdateEnable : Pos 19, 1 Bit
   +0x300 PropagateNode    : Pos 20, 1 Bit
   +0x300 ExplicitAffinity : Pos 21, 1 Bit
   +0x300 ProcessExecutionState : Pos 22, 2 Bits
   +0x300 DisallowStrippedImages : Pos 24, 1 Bit
   +0x300 HighEntropyASLREnabled : Pos 25, 1 Bit
   +0x300 ExtensionPointDisable : Pos 26, 1 Bit
   +0x300 ForceRelocateImages : Pos 27, 1 Bit
   +0x300 ProcessStateChangeRequest : Pos 28, 2 Bits
   +0x300 ProcessStateChangeInProgress : Pos 30, 1 Bit
   +0x300 DisallowWin32kSystemCalls : Pos 31, 1 Bit
   +0x304 Flags            : Uint4B
   +0x304 CreateReported   : Pos 0, 1 Bit
   +0x304 NoDebugInherit   : Pos 1, 1 Bit
   +0x304 ProcessExiting   : Pos 2, 1 Bit
   +0x304 ProcessDelete    : Pos 3, 1 Bit
   +0x304 ControlFlowGuardEnabled : Pos 4, 1 Bit
   +0x304 VmDeleted        : Pos 5, 1 Bit
   +0x304 OutswapEnabled   : Pos 6, 1 Bit
   +0x304 Outswapped       : Pos 7, 1 Bit
   +0x304 FailFastOnCommitFail : Pos 8, 1 Bit
   +0x304 Wow64VaSpace4Gb  : Pos 9, 1 Bit
   +0x304 AddressSpaceInitialized : Pos 10, 2 Bits
   +0x304 SetTimerResolution : Pos 12, 1 Bit
   +0x304 BreakOnTermination : Pos 13, 1 Bit
   +0x304 DeprioritizeViews : Pos 14, 1 Bit
   +0x304 WriteWatch       : Pos 15, 1 Bit
   +0x304 ProcessInSession : Pos 16, 1 Bit
   +0x304 OverrideAddressSpace : Pos 17, 1 Bit
   +0x304 HasAddressSpace  : Pos 18, 1 Bit
   +0x304 LaunchPrefetched : Pos 19, 1 Bit
   +0x304 Background       : Pos 20, 1 Bit
   +0x304 VmTopDown        : Pos 21, 1 Bit
   +0x304 ImageNotifyDone  : Pos 22, 1 Bit
   +0x304 PdeUpdateNeeded  : Pos 23, 1 Bit
   +0x304 VdmAllowed       : Pos 24, 1 Bit
   +0x304 ProcessRundown   : Pos 25, 1 Bit
   +0x304 ProcessInserted  : Pos 26, 1 Bit
   +0x304 DefaultIoPriority : Pos 27, 3 Bits
   +0x304 ProcessSelfDelete : Pos 30, 1 Bit
   +0x304 SetTimerResolutionLink : Pos 31, 1 Bit
   +0x308 CreateTime       : _LARGE_INTEGER
   +0x310 ProcessQuotaUsage : [2] Uint8B
   +0x320 ProcessQuotaPeak : [2] Uint8B
   +0x330 PeakVirtualSize  : Uint8B
   +0x338 VirtualSize      : Uint8B
   +0x340 SessionProcessLinks : _LIST_ENTRY
   +0x350 ExceptionPortData : Ptr64 Void
   +0x350 ExceptionPortValue : Uint8B
   +0x350 ExceptionPortState : Pos 0, 3 Bits
   +0x358 Token            : _EX_FAST_REF
   +0x360 WorkingSetPage   : Uint8B
   +0x368 AddressCreationLock : _EX_PUSH_LOCK
   +0x370 PageTableCommitmentLock : _EX_PUSH_LOCK
   +0x378 RotateInProgress : Ptr64 _ETHREAD
   +0x380 ForkInProgress   : Ptr64 _ETHREAD
   +0x388 CommitChargeJob  : Ptr64 _EJOB
   +0x390 CloneRoot        : _RTL_AVL_TREE
   +0x398 NumberOfPrivatePages : Uint8B
   +0x3a0 NumberOfLockedPages : Uint8B
   +0x3a8 Win32Process     : Ptr64 Void
   +0x3b0 Job              : Ptr64 _EJOB
   +0x3b8 SectionObject    : Ptr64 Void
   +0x3c0 SectionBaseAddress : Ptr64 Void
   +0x3c8 Cookie           : Uint4B
   +0x3d0 WorkingSetWatch  : Ptr64 _PAGEFAULT_HISTORY
   +0x3d8 Win32WindowStation : Ptr64 Void
   +0x3e0 InheritedFromUniqueProcessId : Ptr64 Void
   +0x3e8 LdtInformation   : Ptr64 Void
   +0x3f0 OwnerProcessId   : Uint8B
   +0x3f8 Peb              : Ptr64 _PEB
   +0x400 Session          : Ptr64 Void
   +0x408 AweInfo          : Ptr64 Void
   +0x410 QuotaBlock       : Ptr64 _EPROCESS_QUOTA_BLOCK
   +0x418 ObjectTable      : Ptr64 _HANDLE_TABLE
   +0x420 DebugPort        : Ptr64 Void
   +0x428 WoW64Process     : Ptr64 _EWOW64PROCESS
   +0x430 DeviceMap        : Ptr64 Void
   +0x438 EtwDataSource    : Ptr64 Void
   +0x440 PageDirectoryPte : Uint8B
   +0x448 ImageFilePointer : Ptr64 _FILE_OBJECT
   +0x450 ImageFileName    : [15] UChar
   +0x45f PriorityClass    : UChar
   +0x460 SecurityPort     : Ptr64 Void
   +0x468 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x470 JobLinks         : _LIST_ENTRY
   +0x480 HighestUserAddress : Ptr64 Void
   +0x488 ThreadListHead   : _LIST_ENTRY
   +0x498 ActiveThreads    : Uint4B
   +0x49c ImagePathHash    : Uint4B
   +0x4a0 DefaultHardErrorProcessing : Uint4B
   +0x4a4 LastThreadExitStatus : Int4B
   +0x4a8 PrefetchTrace    : _EX_FAST_REF
   +0x4b0 LockedPagesList  : Ptr64 Void
   +0x4b8 ReadOperationCount : _LARGE_INTEGER
   +0x4c0 WriteOperationCount : _LARGE_INTEGER
   +0x4c8 OtherOperationCount : _LARGE_INTEGER
   +0x4d0 ReadTransferCount : _LARGE_INTEGER
   +0x4d8 WriteTransferCount : _LARGE_INTEGER
   +0x4e0 OtherTransferCount : _LARGE_INTEGER
   +0x4e8 CommitChargeLimit : Uint8B
   +0x4f0 CommitCharge     : Uint8B
   +0x4f8 CommitChargePeak : Uint8B
   +0x500 Vm               : _MMSUPPORT
   +0x5f8 MmProcessLinks   : _LIST_ENTRY
   +0x608 ModifiedPageCount : Uint4B
   +0x60c ExitStatus       : Int4B
   +0x610 VadRoot          : _RTL_AVL_TREE
   +0x618 VadHint          : Ptr64 Void
   +0x620 VadCount         : Uint8B
   +0x628 VadPhysicalPages : Uint8B
   +0x630 VadPhysicalPagesLimit : Uint8B
   +0x638 AlpcContext      : _ALPC_PROCESS_CONTEXT
   +0x658 TimerResolutionLink : _LIST_ENTRY
   +0x668 TimerResolutionStackRecord : Ptr64 _PO_DIAG_STACK_RECORD
   +0x670 RequestedTimerResolution : Uint4B
   +0x674 SmallestTimerResolution : Uint4B
   +0x678 ExitTime         : _LARGE_INTEGER
   +0x680 InvertedFunctionTable : Ptr64 _INVERTED_FUNCTION_TABLE
   +0x688 InvertedFunctionTableLock : _EX_PUSH_LOCK
   +0x690 ActiveThreadsHighWatermark : Uint4B
   +0x694 LargePrivateVadCount : Uint4B
   +0x698 ThreadListLock   : _EX_PUSH_LOCK
   +0x6a0 WnfContext       : Ptr64 Void
   +0x6a8 Spare0           : Uint8B
   +0x6b0 SignatureLevel   : UChar
   +0x6b1 SectionSignatureLevel : UChar
   +0x6b2 Protection       : _PS_PROTECTION
   +0x6b3 HangCount        : UChar
   +0x6b4 Flags3           : Uint4B
   +0x6b4 Minimal          : Pos 0, 1 Bit
   +0x6b4 ReplacingPageRoot : Pos 1, 1 Bit
   +0x6b4 DisableNonSystemFonts : Pos 2, 1 Bit
   +0x6b4 AuditNonSystemFontLoading : Pos 3, 1 Bit
   +0x6b4 Crashed          : Pos 4, 1 Bit
   +0x6b4 JobVadsAreTracked : Pos 5, 1 Bit
   +0x6b4 VadTrackingDisabled : Pos 6, 1 Bit
   +0x6b4 AuxiliaryProcess : Pos 7, 1 Bit
   +0x6b4 SubsystemProcess : Pos 8, 1 Bit
   +0x6b4 IndirectCpuSets  : Pos 9, 1 Bit
   +0x6b4 InPrivate        : Pos 10, 1 Bit
   +0x6b4 ProhibitRemoteImageMap : Pos 11, 1 Bit
   +0x6b4 ProhibitLowILImageMap : Pos 12, 1 Bit
   +0x6b4 SignatureMitigationOptIn : Pos 13, 1 Bit
   +0x6b8 DeviceAsid       : Int4B
   +0x6c0 SvmData          : Ptr64 Void
   +0x6c8 SvmProcessLock   : _EX_PUSH_LOCK
   +0x6d0 SvmLock          : Uint8B
   +0x6d8 SvmProcessDeviceListHead : _LIST_ENTRY
   +0x6e8 LastFreezeInterruptTime : Uint8B
   +0x6f0 DiskCounters     : Ptr64 _PROCESS_DISK_COUNTERS
   +0x6f8 PicoContext      : Ptr64 Void
   +0x700 TrustletIdentity : Uint8B
   +0x708 KeepAliveCounter : Uint4B
   +0x70c NoWakeKeepAliveCounter : Uint4B
   +0x710 HighPriorityFaultsAllowed : Uint4B
   +0x718 EnergyValues     : Ptr64 _PROCESS_ENERGY_VALUES
   +0x720 VmContext        : Ptr64 Void
   +0x728 SequenceNumber   : Uint8B
   +0x730 CreateInterruptTime : Uint8B
   +0x738 CreateUnbiasedInterruptTime : Uint8B
   +0x740 TotalUnbiasedFrozenTime : Uint8B
   +0x748 LastAppStateUpdateTime : Uint8B
   +0x750 LastAppStateUptime : Pos 0, 61 Bits
   +0x750 LastAppState     : Pos 61, 3 Bits
   +0x758 SharedCommitCharge : Uint8B
   +0x760 SharedCommitLock : _EX_PUSH_LOCK
   +0x768 SharedCommitLinks : _LIST_ENTRY
   +0x778 AllowedCpuSets   : Uint8B
   +0x780 DefaultCpuSets   : Uint8B
   +0x778 AllowedCpuSetsIndirect : Ptr64 Uint8B
   +0x780 DefaultCpuSetsIndirect : Ptr64 Uint8B





반응형


윈도우 8/8.1 에서 visual studio 2008 설치하려는데

에러가 발생함.

.NET Framework 3.5 installation error: 0x800F0906, 0x800F081F, 0x800F0907


.net framework 3.5가 설치가 안된다. 인터넷 연결 실패 오류가 뜬다. 실제 인터넷은 연결되어 있는데. ㅡ.ㅡ;;

어쨋거나. 오프라인 설치 방법이 있다.


You can use the Windows installation media as the file source when you enable the .NET Framework 3.5 feature. To do this, follow these steps:

  1. Insert the Windows installation media.
  2. At an elevated command prompt, run the following command:
    Dism /online /enable-feature /featurename:NetFx3 /All /Source:<drive>:\sources\sxs /LimitAccess
    Note In this command, <drive> is a placeholder for the drive letter for the DVD drive or for the Windows 8 installation media. For example, you run the following command:
    Dism /online /enable-feature /featurename:NetFx3 /All /Source:D:\sources\sxs /LimitAccess


https://support.microsoft.com/en-us/kb/2734782


'Develop > Windows' 카테고리의 다른 글

DOS Batch Script  (0) 2019.10.06
curl 사용법/HTTP 테스트  (0) 2019.10.01
화면/윈도우 동영상 녹화 (mp4, gif)  (0) 2019.09.23
windows 10 kernel structure  (0) 2015.08.28
64비트 프로그래밍  (2) 2015.06.05
반응형

제가 2004년도에 윈도우 64비트 프로그래밍을 시작할 때 작성했던 글인데, 우연히 발견하게 되어서 올립니다.

요 약

윈도우즈 운영체제가 32비트에서 64비트로 확장함에 따라 처리 속도 및 효율성 측면에서 성능이 많이 좋아졌다. 그러나, 그 성능을 제대로 발휘하기 위해 대부분 기존의 32비트 프로그램을 64비트로 포팅해야 한다. 그러나 주소 지정 방식이 과거 32비트에서 64비트로 확장됨에 따라 포팅시 고려해야 할 사항들을 정확히 알아야지만, 성공적으로 진행할 수 있을 것이다. 여기서는 윈도우 운영체제의 과거 32비트에서 64비트 플랫폼으로 마이그레이션할 수 있는 포팅 테크닉을 소개한다.

27, Feb, 2004

Written by 크레이지제이

I. 서론

윈도우즈 64비트 운영체제는 개발은 몇 년 전에 되었지만, 아직 베타 테스트 중이다. 앞으로 상용화가 얼마나 잘 이루어질지 모르지만, 사용하는 곳이 많아진다면 소프트웨어나 하드웨어 관련 업체는 모두 적지 않은 영향을 받을 것이다.

64비트 운영체제에서 기존의 32비트 어플리케이션을 지원한다고는 하지만 32비트 레이어를 통해서 내부적으로 64비트 연산 작업이 이루어지기 때문에 속도가 저하될 가능성이 크다. (즉, 주소 자동 변환 과정을 한 번 더 통과해야 한다.) 따라서 64비트 어플리케이션으로 포팅을 하면 별도의 레이어를 통하지 않고, 바로 명령이 수행되기 때문에 높은 성능을 발휘할 것이다.

본 페이퍼에서는 32비트 윈도우 어플리케이션 및 디바이스 드라이버를 64비트로 포팅하기 위한 테크닉 및 Know-How를 기술하는데, 주된 목적은 어떻게 하면 보다 기존의 소스를 그대로 유지하여 32비트, 64비트를 모두 지원하는 방면을 찾는 것이다. 이로 하여금 개발자들의 소스 관리를 편하게 하여, 버그의 발생을 줄일 수 있으며 형상 관리에도 도울을 줄 수 있을 것이다.

II. 윈도우 64비트 운영체제

마이크로소프트에서 현재 64비트를 지원하는 운영체제는 Windows 2003 Enterprise Edition 64-bit, Windows 2003 Datacenter Edition 64-bit, Windows XP 64-bit 가 있다. 아직 국내에는 제대로된 64비트 윈도우 운영체제가 출시되지는 않았다.

윈도우즈 32비트 운영체제에서는 4기가까지의 물리적인 메모리를 지원하나 64비트 운영체제에서는 16 테라 바이트까지 지원할 수 있다. 이로 인해 어플리케이션은 다음과 같은 장점이 생긴다.

메모리 확장으로 인해 어플리케이션에서 더 많은 사용자를 지원할 수 있으며, 보다 높은 성능을 내고, 데이터를 저장 또는 가공 시 더 많은 메모리를 할당할 수 있어 DiskIO가 적게 발생한다.

 

 

III. 64비트 포팅시 주의 사항

64비트 포팅을 위해서는 새로운 데이터 타입이나 Helper 함수들을 사용하기 위해 Platform SDK를 설치해야 한다. Visual Studio 개발도구나 Makefile에서는 Include 디렉토리의 우선 순위를 일반 VC의 include보다 Platform SDK의 include가 높게 해야 한다. (같은 헤더 파일명이 존재할 시, 먼저 참조되도록 해야 한다.)

다음은 32비트 프로그래밍과 64비트 프로그래밍을 하는 경우에 자료구조나 프로그램 구조의 변화나 고려해야될 사항들을 설명하였다.

 

1. 데이터 타입

 

- 과거 데이터 타입 ; 대부분은 변하지 않았으나, 포인터 타입이 64비트로 확장되었다.

* 사이즈가 변경되지 않은 데이터 타입

- char/uchar=8bit, short/ushort=16bits,

- long/ulong=32bits

- LONG과 ULONG = (32 bits)

- INT, UINT, DWORD = (32bits)

- LONGLONG, ULONGLONG = (64bits)

 

* 사이즈가 변경된 데이터 타입

- pointer(char*, PDEVICE_OBJECT... ) = 32bits에서 64bits로 확장되었다.

 

- 새로운 데이터 타입 ; ULONG_PTR, LONG_PTR 타입은 32비트 컴파일러로 컴파일하면 32비트 사이즈로 인식되며, 64비트 컴파일러로 컴파일하면 64비트 사이즈로 인식된다.

 

- 다른 64비트 윈도우 플랫폼과는 달리 AMD64에서는 자료 구조의 "natural" alignment의 실패 (즉, ULONG은 32bit boundary, ULONGLONG은 64비트 boundary로 align하지 못한다.) 가 침형적 에러를 발생시키지 않는다. -> 따라서 이점을 유의하지 않으면, AMD64에서 죽지 않던 것이 다른 곳에서는 블루 스크린을 띄울 수 있다.

 

- 포인터의 정상 사용은 걱정할 필요 없다. 운영체제에 따라 32비트 또는 64비트로 자동으로 인식되기 때문이다.

 

2. 파라미터

 

- 파라미터로 패싱되는 포인터의 자동 인식 ; 32비트 어플리케이션에 의한 포인터 파라미터가 자동으로 64비트로 변경되어 처리된다.

예를 들어 32비트 또는 64비트 어플리케이션에 의한 함수 호출에 관계없이 드라이버에서는 Irp-> UserData 포인터가 64비트로 자동으로 인식될 것이다.

 

3. 버퍼 내 포인터

 

- IOCTL Buffers에 임베디드된 포인터 ;

몇 몇 드라이버들은 주의해야 될 사항이다. IOCTL 버퍼에 포인터가 포함되어 있는 경우, 드라이버는 호출자가 32비트 또는 64비트 어플리케이션 중 어떤 것인지 주의해야만 한다. IOCTL_IN_BUFFER과 OUT_ BUFFER를 가리키는 포인터는 윈도우에 의해 자동으로 변환된다. 그러나, 이 버퍼의 내용에 포인터를 포함하고 있다면, 포팅시 32비트 포인터를 64비트 사이즈로 확장해 주어야 한다.

 

4. 기타

- In-Line Assembler, MMX, 3DNow, and X87 FP 명령어는 지원하지 않는다!!! embedded assembler, MMX, 3DNow, X87 floating pointer는 쓰지 말아라. 다행히 SSE, SSE/2 명령어는 지원한다.

 

간단히 쉽게 정리하자면, 임베디드 어셈블러를 사용하지 말고, IOCTL 버퍼 내에 포인터를 사용하지 않고,(사용하면 64비트로 확장) ULONG을 ULONG_PTR 타입으로 변경(포인터와 관련있다면)하고 컴파일한다.

 

IV. 64비트 포팅 적용

1. 적절한 데이터 타입

 

- 자료 구조에서 포인터를 명시적으로 ULONG타입으로 캐스트하는 경우이다. 컴파일러에 따라 포인터의 사이즈가 달라지기 때문이다. 따라서 이 부분은 ULONG_PTR 타입으로 바꿔주어야 한다.

 

ULONG currentMdl ;

ULONG MdlPointers[10] ;

devExt->MdlPointers[currentMdl++] =

(ULONG) Irp->MdlAddress ;

 

위의 코드는 64비트에서는 작동하지 않는다. 다음과 같이 수정하면 32비트, 64비트가 컴파일러에 따라 모두 적절히 작동된다.

ULONG_PTR MdlPointers[10] ;

devExt->MdlPointers[currentMdl++] =

(ULONG_PTR) Irp->MdlAddress ;

또는

PMDL MdlPointers[10] ;

devExt->MdlPointers[currentMdl++] = (PMDL)

Irp->MdlAddress ;

- Align pointer precision 자료 구조

 

강제로 alignment를 변경하는 pragma는 편할 수 도 있지만 꼭 필요한 경우가 아니면 쓰지 말자.

// #pragma pack(4) // 4 바이트 단위로 정렬

ULONG ulTest ;

ULONG_PTR pTest ;

// #pragma pack() // 해제 (디폴트 단위로..., natural boundary)

구조체에서 필드들의 사이즈는 alignment 단위로 맞춰지기 때문에 자신도 모르게 dummy 메모리가 할당이 된다.

위의 구조체의 크기는 64비트 컴파일러에서 8 byte단위로 alignment가 맞춰지기 때문에 16바이트가 할당이 된다. (32비트 컴파일러에서도 ULONG_PTR대신 64비트 자료형을 써주면 최대 크기인 8바이트 단위로 alignment가 설정된다.) ulTest뒤에 4바이트의 메모리가 더미로 존재하고 8바이트의 pTest가 할당이 되기 때문이다. 강제로 alignment를 4바이트로 설정하는 pragma pack(4) 를 적용하면 12바이트가 되는 것이다.

따라서 명시적으로 dummy 필드를 써 주는 것이 나중을 위해서 좋다. 다음과 같이 구조체 필드를 만들어 확실히 16바이트라는 것을 인지한다.

ULONG ulTest ;

ULONG dummy0; // dummy 추가

ULONG_PTR pTest ;

 

2. The Pointer in DataBuffer

 

전에 설명했던 것과 같이, 64비트 윈도우는 파라미터로 패싱된 포인터를 32비트에서 64비트로 자동 변환한다. 그러나, 전달된 드라이버의 자료구조의 데이터 버퍼 안에 포인터가 존재한다면 어떻게 다뤄야 하는가?

그러한 예는 다음과 같다.

typedef struct _myBuffer {

ULONG Count ;

PUCHAR SecondaryBuffer ;

ULONG SecondaryBufferSize ;

UCHAR Buffer[BUF_SIZE] ;

} MY_BUFFER, *PMY_BUFFER ;

 

32비트 어플리케이션에서 다음과 같은 코드로 작성하였다.

MY_BUFFER buf ;

buf.Count = CharPassed ;

StringCchCopy(buf.Buffer, BUF_SIZE, DataSource, buf.Count) ;

buf.SecondaryBufferSize = OtherBufferSize ;

buf.SecondaryBuffer = PointerToOtherBuffer ;

worked = DeviceIOControl(hDev,

IOCTL_MYDRV_SEND_BUFFER, &buf,

sizeof(MY_BUFFER), NULL, 0,

&byteReturned, NULL) ;

64비트로 포팅하려면 어떻게 해야될 것이다.

 

+ 방법 1

&buf는 자동으로 64비트로 자동으로 인식될 것이다. (thunk buf 포인터 자동 변환)

그러나, 윈도우는 호출자의 IN_BUFFER안에 포인터가 포함되어 있는 줄 모른다.

(SecondaryBuffer) 32비트 또는 64비트 어플리케이션에서 같은 IOCTL을 보낼 때, 버퍼의 적절한 길이와 포인터의 사이즈가 변한다.

어떻게 해결할까? -> 포인터를 없앤다.

typedef struct _myNEWBuffer {

ULONG Count ;

UCHAR Buffer[BUF_SIZE] ;

} MY_NEW_BUFFER, *PMY_NEW_BUFFER ;

secondary buffer는 OUT_BUFFER 파라미터를 이용하여 다음과 같이 할 수 있다.

MY_NEW_BUFFER buf ;

buf.Count = CharsPassed ;

StringCchCopy(buf.Buffer, BUF_SIZE, DataSource, buf.Count) ;

worked = DeviceIOControl(hDev,

IOCTL_MYDRV_SEND_BUFFER, &buf,

sizeof(MY_BUFFER), PointerToOtherBuffer,

OtherBufferSize, &byteReturned, NULL) ;

소스코드와 자료구조가 깨끗해졌다.

위의 방식은 32비트 어플리케이션이 32비트, 64비트 OS 모두 사용할 수 있다. (단, 어떠한 경우라도 드라이버는 32, 64비트용으로 각 각 만들어야 한다.)

 

물론 이러한 방법은 이런 IOCTL 코드를 쓰는 모든 어플리케이션에서 IOCTL 포맷을 새롭게 바꾸고, 모두 다시 컴파일해야 하는 단점이 있다.

 

+ 방법 2

OUT_BUFFER를 사용하지 않고, IN_BUFFER 내에 포인터를 포함시킬 수 있는 방법이다.

 

A 구조체

// Structure version used by all app (and for 64-bit app in Driver)

typedef struct _myBuffer {

ULONG Count ;

PUCHAR SecondaryBuffer ;

ULONG SecondaryBufferSize ;

UCHAR Buffer[BUF_SIZE] ;

} MY_BUFFER, *PMY_BUFFER ;

B 구조체

// Structure version used exclusively by driver when

// getting data from 32-bit apps.

typedef struct _myBuffer_32 {

ULONG Count ;

PUCHAR POINTER_32 SecondaryBuffer ;

ULONG SecondaryBufferSize ;

UCHAR Buffer[BUF_SIZE] ;

} MY_BUFFER_32, *PMY_BUFFER_32 ;

A 구조체는 원본(포팅 전)과 같다.

SecondaryBuffer 포인터가 구조체 내부에 숨겨진 형태로 32비트 어플리케이션에서는 OS에 관계없이 32비트, 64비트 어플리케이션은 64비트 포인터로 인식이 된다. 따라서 32비트용 어플리케이션과 32비트용 드라이버로 컴파일 하고, 64비트용 어플리케이션과 64비트용 드라이버로 컴파일하여 따로 사용할 수 있다.

따라서 운영체제의 커널 비트에 따른 어플리케이션이 별도로 존재해야 하는 단점이 있다.

 

B 구조체는 64비트 윈도우를 위해 만들어진 구조체로써 드라이버가 사용할 것이다. 그러나 32비트 어플리케이션과도 호환된다. 드라이버에서는 호출자가 32비트 어플리케이션 인지 64비트인지를 IoIs32bitProcess()를 통해 확인하여 결정한다.

case IOCTL_MYDRV_SEND_BUFFER:

#ifdef _WIN64

// if it's a 32-bit caller, we validate the size of the 32-bit structure

if (IoIs32bitProcess(Irp))

{

if (ios->Parameters.DeviceIoControl.InputBufferLength >= sizeof(MY_BUFFER_32) )

{..... }

} else

#endif

{

if (ios->Parameters.DeviceIOControl.InputBufferLength

>= sizeof(MY_BUFFER) )

{....}

}

이러한 방식은 32비트 어플리케이션을 위한 구조체를 따로 둠으로써, 64비트 드라이버에서 32, 64비트 어플리케이션을 모두 사용 가능하도록 한다. 그러나 구조체를 각각 관리해야하고, 드라이버에서 32비트를 포인터를 위한 처리를 따로 해 주어야 하는 단점이 있다.

 

3. Inline Assembler, etc...

 

여기서 별도로 다루지는 않겠다. 보다 자세한 정보를 원한다면, Hector가 쓴 OSR Online back in June. 기사를 보면 알 수 있을 것이다.

https://www.osronline.com/article.cfm?id=244

AMD64 컴파일러는 inline assembler code를 지원하지 않는다!!!

또한 윈도우 64비트의 커널모드에서는 MMX, 3DNow, X87 floating point를 지원하지 않는다. !!!

 

 

4. New 3 Class Data Types

 

64비트 프로그래밍을 위해 다음의 세가지 클래스 데이터 타입이 추가되었다.

 

+ Fixed Precision ; 데이터 타입의 사이즈가 고정 길이

DWORD32, DWORD64, INT32, INT64, LONG32, LONG64, UINT32, UINT64, ULONG32, ULONG64

 

+ Pointer Precision ; 포인터 연산을 할 때 사용하면 좋다. 32비트 또는 64비트 윈도우즈에 따라 사이즈가 바뀐다.

DWORD_PTR, HALF_PTR (포인터의 반 크기), INT_PTR, LONG_PTR, SIZE_T, SSIZE_T, UHALF_PTR, UINT_PTR, UINT_PTR, ULONG_PTR

 

+ Specific Pointer-Precision Types

포인터의 사이즈를 명시적으로 선언한다.

POINTER_32 ; 32비트 포인터. 32비트 윈도우에서는 native pointer이지만 64비트에서는 64비트 포인터를 반으로 자른 것이다.

POINTER_64 ; 64비트 포인터. 64비트 윈도우에서는 native pointer이다. 32비트에서는 32비트 포인터를 64비트로 확장시킨 것 임.

 

 

5. Helper Functions (basetsd.h)

 

+ Predefined Macro

_WIN64 ; 64비트 플랫폼

_WIN32 ; 32비트 플랫폼

_WIN16 ; 16비트 플랫폼

 

_M_IA64 ; 64비트 인텔 플랫폼

_M_IX86 ; 32비트 인텔 플랫폼

 

가능하면 위에 있는 _WIN64, _WIN32를 사용하고, 아키텍쳐와 관련된 것을 제외하고는 _M_IA64, _M_IX86 매크로를 쓰지 마라.

 

아래의 API들은 64비트 프로그래밍시 데이터 타입 형 변환에 도움을 준다. 그러나, 꼭 필요한 경우에만 사용해야 한다. 그렇지 않으면 컴파일시 경고나, 에러가 발생하지 않기 때문에 디버깅이 어려워질 수도 있다.

 

unsigned long HandleToUlong( const void *h )

long HandleToLong( const void *h )

void *LongToHandle( const long h )

unsigned long PtrToUlong( const void *p )

unsigned int PtrToUint( const void *p )

unsigned short PtrToUshort( const void *p )

long PtrToLong( const void *p )

int PtrToInt( const void *p )

short PtrToShort( const void *p )

void * IntToPtr( const int i )

void * UIntToPtr( const unsigned int ui )

void * LongToPtr( const long l )

void * ULongToPtr( const unsigned long ul )

 

 

6. 64비트 포인터 사용 규칙

 

- int, long, ULONG, DWORD로 포인터를 타입 캐스팅하면 안 된다.

이 경우 ULONG_PTR 타입을 사용한다.

HANDLE은 void*로 정의되어 있다. 따라서 ULONG으로 캐스팅하면 안 될 것이다.

 

- 필요한 경우 PtrToLong, PtrToUlong을 사용하여 포인터를 truncate시켜라. (helper function)

포인터를 32비트 값으로 자를 때 사용한다.(상위 32비트가 날라간다.) 편하지만 경고가 발생하지 않기 때문에, 디버깅하기가 어려우므로 조심히 사용해야한다.

 

- OUT 파라미터로 사용 시 주의해야 한다.

void func(OUT PULONG *PointerToUlong) ; 이런 함수가 있다고 가정하고...

ULONG ul ;

PULONG lp ;

func((PULONG *)&ul) ;

lp = (PULONG) ul ;

위와 같이 사용하는 경우, func의 두 번째 파라미터는 이중 포인터 타입이다. 64비트인 경우, *PointerToUlong (PULONG)도 64비트이므로 ul (ULONG)과는 사이즈가 다르다.

 

위의 코드를 아래와 같이 수정해야 한다.

PULONG lp ;

func(&lp) ;

- 다중 인터페이스를 조심해야 한다.

(polymorphic interfaces)

다양한 파라미터를 받기 위해 주소 값 또는 정수 등의 값을 DWORD 파라미터를 사용하였다면, UINT_PTR이나 PVOID로 바꿔라.

 

- 새로운 윈도우 클래스 함수를 사용하라.

GetClassLongPtr, GetWindowLongPtr,

SetClassLongPtr, SetWindowLongPtr

GWL_* 대신 GWLP_*를 사용하라.

(winuser.h)

SetWindowLong(hWnd, GWL_WNDPROC,

(LONG)MyWndProc) ;

위의 코드를 다음과 같이 수정하라.

SetWindowLongPtr(hWnd, GWLP_WNDPROC,

(LONG_PTR)MyWndProc) ;

- 모든 윈도우와 클래스 데이터에 접근시 FIELD_OFFSET을 사용하라.

두 번째 포인터가 항상 옵셋 4라고 생각하지 마라. 32비트에서만 유효하다.

 

- LPARAM, WPARAM, LRESULT 타입은 플랫폼에 따라 사이즈가 변하므로 주의해야 한다.

 

7. 기타 정보

 

- 64비트 어플리케이션은 유저 모드 주소 영역이 8테라 바이트이다. 그러나, 다음과 같은 조건의 프로그램은 유저 모드 주소를 2기가 이하에서만 작동하게 할 수 있다.

> 2기가 주소 영역이면 충분하다.

> 많은 pointer truncation 경고가 많다.

> 포인터와 정수형이 마구 섞여 쓰고 있다.

> 32비트 데이터 타입을 쓰는 polymorphism이 코드에 있다.

이러한 경우 아래와 같은 링커 옵션을 준다.

/LARGEADDRESSAWARE:NO

조심할 점은 DLL을 이 옵션으로 만들었다면, 이 DLL을 사용하는 모든 프로그램도 같은 옵션으로 만들어져야만 된다. (이 DLL이 주소를 32비트로 자르기 때문이다.)

 

- Process interoperability

 

64비트 윈도우에서 32비트 어플리케이션을 에뮬레이션 모드에서 돌릴 수 있다. 그러나, 64비트 프로세스는 32비트 DLL을 로드할 수 없다. 그 반대도 마찬가지다.

64비트와 32비트 프로세스 사이의 RPC 통신이 COM 서버를 이용하는 방법이 있긴 하다.

 

- Driver

드라이버를 64비트로 포팅할 경우 다음의 사항을 고려해야 한다.

> 4G 이상을 지원하고 싶다면, Mm64BitPh ysicalAddresses를 사용하여 64비트 주소가 필요한 경우 사용한다. 또한 DEVICE_DESCRIPTI ON 구조체의 Dma64BitAddresses 멤버를 설정하여 64비트 어드레싱을 할 수 있다.

> IO status block은 ULONG_PTR이다.

> IRP stack location은 ULONG_PTR이다.

 

 

- 64비트 프로그래밍 경고 및 에러

warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long' -> 이러한 에러는 다음과 같은 예에서 발생한다.

buffer = (PUCHAR)srbControl;

(ULONG)buffer += srbControl->HeaderLength;

위의 코드를 아래처럼 수정하라.

buffer = (PUCHAR)srbControl;

(ULONG_PTR)buffer += srbControl->HeaderLength;

- 64-bit Compiler Switches and Warnings

 

컴파일러가 LLP64 데이터 모델인 경우

LLP64로 포팅하는데 -Wp64 -W3 경고 옵션이 도움을 줄 것이다.

C4305: Truncation warning. For example, "return": truncation from "unsigned int64" to "long."

C4311: Truncation warning. For example, "type cast": pointer truncation from "int*_ptr64" to "int"

C4312: Conversion to bigger-size warning. For example, "type cast": conversion from "int" to "int*_ptr64" of greater size.

C4318: Passing zero length. For example, passing constant zero as the length to the memset function.

C4319: Not operator. For example, "~": zero extending "unsigned long" to "unsigned _int64" of greater size.

C4313: Calling the printf family of functions with conflicting conversion type specifiers and arguments. For example, "printf": "%p" in format string conflicts with argument 2 of type "_int64." Another example is the call printf("%x", pointer_value); this causes a truncation of the upper 32 bits. The correct call is printf("%p", pointer_value).

C4244: Same as the existing warning C4242. For example, "return": conversion from "_int64" to "unsigned int," possible loss of data.

 

 V. 결론

이로써 32비트 어플리케이션 및 드라이버를 64비트로 포팅하는데 있어서 주의해야 될 사항들과 어떻게 포팅해야 할 지에 대한 소스코드 예를 몇 가지 살펴보았다.

크게는 별로 변한 게 없는 듯(포인터 사이즈 하나가 변했다고) 하지만, 실제 소스 레벨로 가서 보면 발생할 수 있는 제 2, 제 3의 문제가 연쇄적으로 발생할 수 있음을 알 수 있다. 다른 프로그램과의 통신, 구조체의 사이즈 변형, 포인터 연산, Alignment 등 생각할 것도 많고, 소스코드를 32비트, 64비트 머신 모두에게 돌아갈 수 있도록 유지할 수 있게 고뇌해야할 것이다.



참 고

 

 

1. Rock On With 64-bit Windows -- Porting Windows Drivers To AMD64 ;

http://www.osronline.com/article.cfm?id=265

 

2. Platform SDK: 64-bit Windows Programming

http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/win64/win64/changing_an_existing_interface.asp

 

 

반응형


인코딩 변경을 하려고 보통 이렇게 하는데 이것은 잘못된 결과를 발생시킨다.

String strutf8 = new String(str.getBytes("utf-8"), "euc-kr") ;

getBytes는 지정된 charset의 byte array로 변환하는 것이고, String() constructor에서는 입력받은 데이터를 지정한 charset으로 인식하여 스트링을 만들겠다는 것이다. 즉, 원하는대로 charset 변경이 안 이루어진다.!!!!


타 시스템에서 다른 인코딩(euc-kr)을 사용하고 있는데 연동을 해야하는 일이 있었다. 부득이하게 charset 변경을 해야해서 바이너리값을 찍어서 직접 비교해봤다.

아래는 테스트 결과 성공.


+ UTF-8 -> euc-kr

//이클립스 환경설정의 인코딩 스타일이 UTF-8로 지정된 경우.
String utfstr = “한글인코딩" ;

Charset utf8charset = Charset.forName(
"UTF-8");
Charset iso88591charset = Charset.forName("euc-kr");
ByteBuffer inputBuffer = ByteBuffer.wrap(utfstr.getBytes());

// decode UTF-8
CharBuffer data = utf8charset.decode(inputBuffer);
// encode ISO-8559-1
ByteBuffer outputBuffer = iso88591charset.encode(data);
byte[] outputData = outputBuffer.array();

System.out.println("euckr?="+bytesToHex(outputData));

<끝>

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
   
 char[] hexChars = new char[bytes.length * 2];
   
 for ( int j = 0; j < bytes.length; j++ ) {
       
 int v = bytes[j] & 0xFF;
        hexChars[j * 2] =
 hexArray[v >>> 4];
        hexChars[j * 2 + 1] =
 hexArray[v & 0x0F];
    }
   
 return new String(hexChars);
}



반응형

JAVA 기반 WAS 개발시에 한글이 종종 깨지는 경우가 많다. 이런 경우 해결하기 위해 상당한 시간이 소요될 수 있다. 한글이 깨지는 원인이 여러 가지 있을 수 있어서 설정하는 부분도 여러군데이다. 

UTF-8 인코딩 방식을 기준으로 나름대로 정리. 


+ 한글이 깨질때...


1. 이클립스에서 소스(html, jsp, java 등) 저장시 인코딩 포맷을 UTF-8로 설정한다.

2. 받은 스트링을 byte []로 변환시 인코딩을 지정하지 않으면, 시스템 디폴트 인코딩으로 되어서 깨질 수 있다.

String str="한글테스트"; 
byte[] buf = str.getBytes() ;
byte[] buf2 = str.getBytes("UTF-8") ; // 이렇게 한다. ; UNICODE 스트링을 해당 타입으로 인코딩해 준다.

String str2 = new String(buf2, "UTF-8") ;     // 이렇게 받는다. UTF-8 형식으로 알고, 디코딩하라는 의미. (인코딩(변환)하는게 아님)

3. tomcat 서버 설정 (GET방식 안쓰면 안 해도 됨)
HTTP body의 입력 스트림은 기본으로 UTF-8을 이용하여 디코딩한다. 그러나, URL은 ISO-8859-1로 디코딩한다.
브라우저에서 폼 데이터는 기본적으로 UTF-8로 인코딩하므로 POST 전송해도 문제가 없는 것이다. 그러나, GET 방식이면 당연히 문제가 생긴다. 이를 한 번에 해결하려면 아래와 같이 URL 인코딩 방식을 변경해주면 가능하다.

server.xml에서 사용하는 포트 8080, 8443 등 Connector 부분에 URIEncoding을 지정한다.
<Connector port="8080" ... URIEncoding="UTF-8" />

아파치와 연결하기 위해 mod_jk를 사용한다면 아래와 같이 한다.
<Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" />

JSP상에서는 아래와 같이 사용하면 된다.
<a href="show.html?param= <%=java.net.URLEncoder("한글테스트", "UTF-8")%>"> link </a>

4. java에서 데이터 받는 부분 인코딩 설정을 한다.
doPost(HttpServletRequest request, ...) {
request.setCharacterEncoding("UTF-8") ;     // 한글 수신을 제대로 하기 위함. 이후 request 데이터 변수 사용.
}

응답시에는 
response.setContentType("application/json; charset=utf-8") ;
주의사항!!!! (강조!!!)
반드시 PrintWriter out = response.getWriter(); 전에 위의 설정을 해 줘야 한다. 순서가 바뀌면  동작하지 않는다... 

-JSP에서는 다음과 같이한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>


5. jdbc & mysql ; DB에 들어갈 때 깨지면 다음을 확인한다.

-java에서 mysql 접속시, 인코딩 방식 지정.
String url="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8";
Connection con = DriverManager.getConnection(url, "id", "password") ;

-mysql에서 테이블 생성시 인코딩 지정.
CREATE TABLE tablename (
col VARCHAR(100)
) DEFAULT CHARSET=utf8 ;

또는
CREATE TABLE ...
()  COLLATE='utf8_general_ci'

ENGINE=InnoDB
AUTO_INCREMENT=40;


6. ajax에서 한글설정
        var jsonData1 = JSON.stringify ({
              CMDID: "LIST",
              logonid : logonid }) ;
       $.ajax( {
              url: "/servicetest/apitest",
              type: "POST",
              data : jsonData1,
              contentType : "application/json; charset=UTF-8" ,
              dataType : 'json',
              success : function(data) ...
           });

7. 시스템 (OS) 환경의 언어세팅 문제일 수 도 있다. (중요!)
톰캣을 실행할 때, 환경 변수의 설정 상태가 중요하다!.
profile에 LANG=ko_KR.eucKR
또는 톰캣 구동 스크립트 (catalina.sh 등)에 추가.



'Develop > Java' 카테고리의 다른 글

CentOS, tomcat 타임존 문제  (2) 2018.03.06
tomcat 외부라이브러리 경로 설정 및 톰캣 튜닝  (0) 2018.03.06
jqGrid(2) row(줄) 색상 변경/값 변경  (0) 2016.01.22
jqGrid (1)  (0) 2016.01.19
한글 인코딩 UTF8  (0) 2015.06.02
반응형
  • vi 시작
    vi filename ; 파일열기, 작성
    vi +10 filename ; 파일 열고 n행으로 이동
    vi +/"hello" filename ; 파일 열고 hello 문자열로 이동
    vi -r filename ; 손상된 파일 복구
    view filename ; 읽기 전용 모드로 파일 열기
    !vi ; 마지막으로 vi 실행했던 커맨드 다시 실행하기
    vi f\[TAB\] ; f로 시작하는 파일명을 선택하기.  \[TAB\]을 더 누르면 f로 시작하는 파일명들을 모두 보여줌.

    * ^M 문자 없애기 (DOS 포맷 텍스트파일을 linux에서 열 때 발생)
    :%s/컨트롤+V누르고 M 또는 엔터//g
    (가끔 터미널에 따라 안될 수도 있음.(단축키가 대신 먹을 때도 있음). 그 경우에는 키 입력을 컨트롤+V누르고 엔터키를 눌러서 대체할 수 있음.)
  • VI (ESC 키 누른 이 후에 커맨드 모드)
    i 현재위치에서 삽입  
    I 현재줄의 처음 위치에서 삽입  
    a 현재 위치에서 추가  
    A 현재줄의 끝 에서 추가  
    o 새로운 한 줄을 커서 아래줄에 연다.  
    O 새로운 한 줄을 커서 위줄에 연다.  
    S 줄을 지우고 삽입모드로  
    R 현재 위치에서 Relpace 모드로  
    J 다음줄과 현재줄을 합친다.  
    ~ 대문자<->소문자  
    . 마지막 명령을 반복한다  
    u (<-> CTRL-R) 마지막 수정한 것을 취소한다.  
    U 줄을 처음 상태로 복구한다.  


-edit-  
cw 한 단어  
2cw or c2w 두 단어  
cc 한 행  
c$ or C 커서 위치에서 행의 끝까지  
cO 커서 위치에서 행의 처음까지  
r 한 문자 변경

-delete-  
dw 한 단어  
2dw or d2w 두 단어  
dd 한 행  
d$ or D 커서 위치에서 행의 끝까지  
dO 커서 위치에서 행의 처음까지  
x (del) or X(bs) 한 문자 삭제

- yanking, copy -  
yw 한 단어  
2yw or y2w 두 단어  
yy 한 행 복사 to clipboard  
3yy ; 세줄 복사 (앞에 복사할 수만큼입력)

y$ or Y 커서 위치에서 행의 끝까지 !!!!  
yO 커서 위치에서 행의 처음까지  
y1 or yh 한 문자 변경  
p ; paste 붙여넣기 (현재 줄 아래에 )  
P ; 현재 커서 윗줄로 삽입

- 커서 이동 - 
h, j, k, l 좌, 하, 상, 우  
\+ or \[enter\] 다음줄의 첫번째 문자로  
\- 이전줄의 첫번째 문자로  
e, E 단어의 끝으로  
w, W 다음 단어로  
b, B 이전 단어로  
$ 행의 끝으로  
0 행의 처음으로 ( 'A' 인 경우 A앞으로 커서이동)  
^ 행의 처음으로 ( 'A' 인 경우에도 맨앞으로 커서이동)  
), ( 다음, 이전 문장의 처음으로  
}, { 다음, 이전문단의 처음으로  
\]\], \[\[ 다음, 이전 구절의 처음으로

^F 한 화면 앞으로 스크롤 (means CTRL-F)  
^B 한 화면 뒤로 스크롤  
^D 반 화면 앞으로 스크롤  
^U 반 화면 뒤로 스크롤  
^E 한 줄 앞으로 스크롤  
^Y 한 줄 뒤로 스크롤  
H 화면의 맨 위줄로 ( nH인 경우 맨 위에서 n행 밑으로 )  
M 화면의 중간 줄로  
L 화면의 맨 아래줄로 ( nL인 경우 맨 밑에서 n행 위로 )

- 검색, 이동 -

/pattern 문자열의 처음에서 앞으로 검색  
?pattern 문자열의 처음에서 뒤로 검색  
n 검색을 다시 반복 (같은 방향)  
N 검색을 다시 반복 (반대 방향)  
fx 현재 줄에서 x가 있는 곳으로 이동 (앞으로)  
Fx 현재 줄에서 x가 있는 곳으로 이동 (역방향)  
tx n행 밑에서 x가 있는 곳으로 이동  
Tx n행 위에서 x가 있는 곳으로 이동  
; 줄에서 찾기를 같은 방향으로 반복  
, 줄에서 찾기를 반대 방향으로 반복  
nG, :n 행 이동 n번째 줄로 이동 (n이 생략되면 마지막줄로) --변환자 주: 이  
기능은 :n 으로 하는것이 편합니다 :)  
G : 마지막 줄로 이동  
nl 열 이동 (n이 생략되면 처음 열로)  
\* 현재 커서가 위치한 단어 찾기 (앞방향)  
\# 현재 커서가 위치한 단어 찾기 (역방향)

mx 현재 위치를 x 이름의 마크로 저장  
\`x 마크한 위치(행, 열)로 이동  
'x 마크한 줄로 이동  
\`\` 이전에 마크한 위치로 이동  
'' 이전에 마크한 줄로 이동

\+ c 코드 분석기
  • vi 기타 커맨드
블록 지정 하여 복사  
    v , 커서 이동 하면 문자 단위 블록 지정. y하면 복사 or x하면 잘라내기. 붙이기는 p. 삭제는 d  
    대문자 V, 커서 이동 하면 라인 단위 블록 지정.

{, } 문자에서 %를 누르면 {} 단위를 모두 선택함.  
^V ; 사각형 형태의 블록 지정  
(windows gvim에서는 ^Q 임.)

+ 쉘로 나갔다가 돌아오기.  
^z 로 나가서 fg 커맨드로 돌아올 수 있다.  
\+ 여러 창으로 작업하기 (screen 유틸)  
screen에서는 C-a S 로 창을 쪼개고  
C-a 으로 창 전환.  
C-a c로 쪼개진 창에 쉘 띄운다.

-- 기타 커맨드

:set nu = set number ; 라인 넘버 보이기  
:q ; 종료  
:qa! ; 강제 종료  
:ZZ ; 저장 후 종료.

--gui에서 beep음 끄기  
:xset b off

-cui에서 끄기  
setterm -blength 0  
setterm -bfreq 10 (작은 소리로 변경)

-- copy & paste  
[숫자]+yy -> p or P or shift+insert

-- delete  
[숫자]+dd ; 행 삭제  
[숫자]+x ; 문자 삭제

-- 반복  
. ; 방금한 것을 반복

-- edit 모드

I ; 현재 첫부분에 편집  
i ; 현재 위치에서 편집  
O ; 윗줄삽입  
o ; 아랫줄 삽입

--검색  
/[검색문자열]

-- 이동  
^+F ; (아래로)  
^+B ; (상위)

-특정 라인으로 이동  
[라인번호]G  
$는 마지막을 의미.

-첫라인으로 이동 ; 1G, 또는 gg  
-마지막라인으로 이동 ; $g 또는 G  
-undo = u  
-redo = ^+r

-- replace ; subsitute  
:%s/[검색어]/[변경어]/g  
:[시작행],[끝행]s/[검색어]/[변경어]/g

-- 예제  
ex) , 를 엔터로 변경  
:%s/,/[변경값]/g  
변경값에 Ctrl+V+Enter 입력 ==> ^M으로 보임. (터미널 클라이언트에 따라 안될 수도 있음. (그럴 경우, ^+V+M 으로 입력?))

ex) 특정 단어가 있는 줄 지우기  
:g/[검색단어]/d

-   여러 문서 편집  
    :args (확인)  
    :n (다음)  
    :3n (3개 스킵 다음)  
    :N (이전)  
    :prev
-   현재 라인에서 특정단어 앞까지 삭제  
    d/\[특정단어\]

:= 현재 행번호 출력

> > 들여쓰기 (tab 추가) ^t(삽입모드시)  
> > << 당겨 쓰기 ^d(삽입모드시)

-   빈 라인 삭제  
    :g/^$/d  
    :%s/^\n//g

-   VIM에서 del, bs 키 입력 설정  
    .vimrc 에 t_kb, t_kD 를 입력하기 위해서 아래와 같이 하면 된다.  
    set t_kb=^H  
    set t_kD=^?  
    [ctrl] + [v],[h] : ^H 가 입력됨  
    [ctrl] + [v],[backspace] : ^? 가 입력됨
  • .exrc 예제

set nu
set autoindent 
set cindent 
set showmatch 
set ts=4
  • 홈디렉터리에 .vimrc 예제

set nocompatible " 오리지날 VI와 호환하지 않음  
set autoindent " 자동 들여쓰기  
set cindent " C 프로그래밍용 자동 들여쓰기  
set smartindent " 스마트한 들여쓰기  
set wrap  
set nowrapscan " 검색할 때 문서의 끝에서 처음으로 안돌아감  
set nobackup " 백업 파일을 안만듬  
set visualbell " 키를 잘못눌렀을 때 화면 프레시  
set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸) 표시  
set shiftwidth=4 " 자동 들여쓰기 4칸  
set number " 행번호 표시, set nu 도 가능  
set fencs=ucs-bom,utf-8,euc-kr.latin1 " 한글 파일은 euc-kr로, 유니코드는 유니코드로  
set fileencoding=utf-8 " 파일저장인코딩  
set tenc=utf-8 " 터미널 인코딩  
set expandtab " 탭대신 스페이스  
set hlsearch " 검색어 강조, set hls 도 가능  
set ignorecase " 검색시 대소문자 무시, set ic 도 가능  
set tabstop=4 " 탭을 4칸으로  
set lbr  
set incsearch " 키워드 입력시 점진적 검색  
syntax on " 구문강조 사용  
filetype indent on " 파일 종류에 따른 구문강조  
set background=dark " 하이라이팅 lihgt / dark  
colorscheme desert " vi 색상 테마 설정  
set backspace=eol,start,indent " 줄의 끝, 시작, 들여쓰기에서 백스페이스시 이전줄로  
set history=1000 " vi 편집기록 기억갯수 .viminfo에 기록

'Develop > Linux_Unix' 카테고리의 다른 글

[도커] tomcat, mariadb 환경 war hang/slow  (0) 2021.04.28
Bash Tip 작업속도를 빠르게  (0) 2021.03.03
리눅스 백그라운드 실행(터미널종료에도)  (1) 2021.02.23
Git 사용법_요약  (0) 2019.12.16
Ubuntu18/tomcat8 setup  (0) 2019.11.08

+ Recent posts