선작업
Windows SDK 최신으로 깔아주시고 .. 2008 쓰면 자동으로 깔리는데 현제 윈도우7지원까지나옴
DDK 요것도 깔아주시고
해더 라이브러리 걸어주시고  하면되요 ~_~;;

// TestJniFile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Common.h"


int main(int argc, char* argv[])
{

  HDEVINFO hDevInfo;
  SP_DEVINFO_DATA DeviceInfoData;
  DWORD iCnt;
  ///FILE *fp;
  char str_buffer[100];
  char * sDiveName = "USB"; // 인자 받은것 포트번호
  int iState =1; ///  죽이냐 살리느냐 0 살린다 1 죽인다.


  // Create a HDEVINFO with all present devices.
  hDevInfo = SetupDiGetClassDevs( NULL,
          0, // Enumerator
          0,
          DIGCF_PRESENT | DIGCF_ALLCLASSES );   // 디바이스 정보를 가저오는곳입니다.. DIGCF_PRESENT | DIGCF_ALLCLASSES  이부분인자를 바꺼줌으로써.. 가져울 정보의 갯수를
                                                                       바꿀수있다 그래픽만 , 아님 이너넷만 머 이런식인듯...  인터넷 찾아보면 길이보임 .. 난 잘모름 .. 나하하 ~ 

  if (hDevInfo == INVALID_HANDLE_VALUE)
  {  
   return 1;
  }

  DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  for (iCnt=0;SetupDiEnumDeviceInfo(hDevInfo,iCnt,&DeviceInfoData);iCnt++) /// 갯수 가지고 포문 을 돌린다 한갯식 정보를 가져와야지/
  {
  DWORD DataT;
  LPTSTR buffer = NULL;
  DWORD buffersize = 0;
  int i=SPDRP_DEVICEDESC;

  while (!SetupDiGetDeviceRegistryProperty(   // 디바이스의 각종 정보를 가져온다.
             hDevInfo,
             &DeviceInfoData,
             SPDRP_FRIENDLYNAME,  // 디바이스 정보가저오는것을 여기서 변경할수있다 아이디 또는 머 기타 부수적인것 변경해줌으로써 내용이 바뀐다.
             &DataT,
             (PBYTE)buffer,
             buffersize,
             &buffersize)
    )
    {
   if (GetLastError() ==ERROR_INSUFFICIENT_BUFFER)
   {
     // Change the buffer size.
     if (buffer) LocalFree(buffer);
     // Double the size to avoid problems on
     // W2k MBCS systems per KB 888609.
     buffer = (LPTSTR)LocalAlloc(LPTR,buffersize * 2);
   }
   else
   {
    // Insert error handling here.
     break;
   }
    }
    printf("장치명 :[ %s ]  \n",buffer);
    /// LGE CDMA USB Serial Port(COM7)
  
    sprintf_s(str_buffer,"%s\n",buffer);
    if(strstr(str_buffer,sDiveName))
    {  
   
   if  (iState == 0)
   {    
    if (DiviceStateChange(DICS_ENABLE, iCnt , hDevInfo)){
     printf("Divice Name :[ %s ] Divice Num -> %d 을 사용으로 변경완료. \n",buffer,iCnt);
    }
    else
    {
     printf("Divice Name :[ %s ] Divice Num -> %d 을 사용으로 변경하려 했지만 실패 하였습니다.. \n",buffer,iCnt);
    }
    
   }
   else
   {
    if (DiviceStateChange(DICS_DISABLE, iCnt , hDevInfo) )
    {
     printf("Divice Name :[ %s ] Divice Num-> %d 을 사용 않함으로 변경완료. \n",buffer,iCnt);
    }
    else
    {
     printf("Divice Name :[ %s ] Divice Num -> %d 을 사용 않함으로 변경하려 했지만 실패 하였습니다.. \n",buffer,iCnt);
    }
    
   } 
   getchar();
   return 0; 
   
    } 

  };
 getchar();
  if ( GetLastError()!=NO_ERROR &&
  GetLastError()!=ERROR_NO_MORE_ITEMS )
  { 
  return 1;
  }
 
     SetupDiDestroyDeviceInfoList(hDevInfo);
 
  return 1;
}

BOOL DiviceStateChange(DWORD NewState, DWORD SelectedItem,HDEVINFO hDevInfo)
{
    SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)};
    SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
    //  HCURSOR hCursor;

    //
    // This may take a while :^(
    //
 //   hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));

    //
    // Get a handle to the Selected Item.
    //
 
    if (!SetupDiEnumDeviceInfo(hDevInfo,SelectedItem,&DeviceInfoData))
    {
        DisplayError(TEXT("EnumDeviceInfo"));
        return FALSE;
    } 

    //
    // Set the PropChangeParams structure.
    //
 PropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);  
    PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
    PropChangeParams.Scope = DICS_FLAG_GLOBAL;
    PropChangeParams.StateChange = NewState;
 PropChangeParams.HwProfile = 0;


    if (!SetupDiSetClassInstallParams(hDevInfo,
        &DeviceInfoData,
        (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
        sizeof(PropChangeParams)))
    {
        DisplayError(TEXT("SetClassInstallParams"));     
  return FALSE;
    }
 
    if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,
        hDevInfo,
        &DeviceInfoData))
    {     
        return TRUE;
    }
    return TRUE;
}

 


hader 구조
JNIEXPORT jint JNICALL Java_com_common_aa_diviceStateChange
  (JNIEnv * env, jobject obj , jint iState, jbyteArray blDiveName);
---------------------------------------------------------------
JNIEXPORT jint JNICALL Java    --> 여기 까지는 기본으로 만들어진다.
_com_common -- > 패키지 위치
_aa  --> 클레스이름
_diviceStateChange -->함수명
(JNIEnv * env, jobject obj  --> 기본으로 만들어지는  값들
, jint iState, jbyteArray blDiveName); --> 내가 인자 넘기는 값이 정의 대어있다 . 여기서보면 int 형은 jint 로 보이고  , byte값은 jbyteArray  값으로 나타난다.


------------------------------------------------------------------
cpp 만들기
해더파일 복사해서 붙여넣기하면 끝 ... 그담에 ; 빼고 {} 묵고 그안에다가 자료 넣는다 리턴값이있는 클래스 이기 때문에 .. 리턴값정의한다.
JNIEXPORT jint JNICALL Java_com_common_aa_diviceStateChange
  (JNIEnv * env, jobject obj , jint iState, jbyteArray blDiveName)
{
return int a =0; // 대는지는 모름 .. ㅋㅋㅋㅋ c 문법에 맞게 하세요
}
그담에 컴파일 f7 누루면 DLL만들어진다..

참고

디버깅 예
F9 브러킹 거는거
F5 는 블럭킹 건거 순차적으로 디버깅 (DLL 만들떄는 안돼요 실행파일이 없기때문에 ?? 아님 나도 몰름 .. 이상한 창뜸 ..)
F7 컴파일
조사식에  자료형태를 보고싶으면 마우스로 끌어당기면 보인다 @,.@ 신기..