6 #include <iba/ib_types.h>
\r
7 #include <iba/ib_al.h>
\r
17 /* common query parameters */
\r
18 typedef struct _REQUEST_IN
\r
24 unsigned short pkey_num;
\r
25 unsigned __int16 pkeys[MAX_NUM_PKEY];
\r
31 #define DEFAULT_BUFER_SIZE 1024
\r
32 static const char IBBUS_SERV_KEY[] = {"SYSTEM\\CurrentControlSet\\Services\\ibbus\\Parameters"};
\r
36 printf("Usage : part_man.exe <show|add|rem> <pkey1 pkey2 ...>\n");
\r
39 /********************************************************************
\r
40 * name : reg_ibbus_pkey_show
\r
41 * read registry pkey and optionally prints it
\r
42 * input : show - whether to print
\r
43 * output: partKey - contains read pkeys, reg_handle
\r
44 * return: number of characters read
\r
45 ********************************************************************/
\r
46 static int reg_ibbus_pkey_show(IN BOOLEAN show,OUT char *partKey, OUT HKEY *reg_handle)
\r
50 DWORD read_length = DEFAULT_BUFER_SIZE;
\r
52 ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,IBBUS_SERV_KEY,0,KEY_SET_VALUE | KEY_QUERY_VALUE ,reg_handle);
\r
53 if (ERROR_SUCCESS != ret)
\r
55 printf("reg_ibbus_pkey_show error = %d\n",GetLastError());
\r
61 ret = RegQueryValueEx(*reg_handle,"PartitionKey",NULL,NULL,(LPBYTE)partKey,&read_length);
\r
62 if (ERROR_MORE_DATA == ret)
\r
64 printf("reg_ibbus_pkey_show : more buffer space required\n");
\r
69 if (ERROR_SUCCESS != ret)
\r
71 printf("RegQueryValueEx : Error %d\n",ret);
\r
75 retval = (int)read_length;
\r
79 printf("Existing Pkey(s): %s\n",partKey);
\r
88 static boolean_t reg_ibbus_print_pkey()
\r
91 char pkeyBuf[DEFAULT_BUFER_SIZE];
\r
94 result = reg_ibbus_pkey_show(TRUE,(char*)pkeyBuf,&hreg);
\r
96 RegCloseKey( hreg );
\r
100 printf("No configured pkey found\n");
\r
106 static int reg_ibbus_pkey_add(const uint16_t *pkeys, uint16_t pkey_num,OUT pkey_array_t *pkey)
\r
108 char partKey[DEFAULT_BUFER_SIZE];
\r
117 read_length = reg_ibbus_pkey_show(FALSE,(char*)partKey,®_handle);
\r
119 if (read_length < 4)
\r
121 /* empty string read, simply write to registry */
\r
122 cnt = sprintf(partKey,"0x%04X",pkeys[0]);
\r
123 pkey->pkey_array[pkey->pkey_num] = pkeys[0];
\r
129 /* update the existed registry list */
\r
130 cnt = (int)strlen(partKey);
\r
134 for ( ;i < pkey_num; i++)
\r
136 sprintf(tmp,"0x%04X",pkeys[i]);
\r
137 if (strstr(partKey,tmp))
\r
141 pkey->pkey_array[pkey->pkey_num] = pkeys[i];
\r
143 cnt += sprintf(partKey + cnt,",0x%04X",pkeys[i]);
\r
145 cnt += sprintf(partKey + cnt,"\0");
\r
149 ret = RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)partKey, (DWORD)cnt);
\r
150 if (ERROR_SUCCESS != ret)
\r
152 printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());
\r
157 printf("No pkey to add\n");
\r
158 RegCloseKey( reg_handle );
\r
162 static int reg_ibbus_pkey_rem(const unsigned __int16 *pkeys, unsigned short pkey_num,OUT pkey_array_t *pkey)
\r
164 char partKey[DEFAULT_BUFER_SIZE];
\r
165 char newKey[DEFAULT_BUFER_SIZE] = {'\0'};
\r
171 unsigned __int16 cur_pkey;
\r
173 unsigned short i = 0;
\r
176 boolean_t found2remove;
\r
178 read_length = reg_ibbus_pkey_show(FALSE,(char*)partKey,®_handle);
\r
181 if (read_length < 4)
\r
183 /* empty string read, nothing to delete */
\r
184 printf("No pkey configured - nothing to remove\n");
\r
189 token = strtok(partKey,seps);
\r
193 found2remove = FALSE;
\r
194 converted = sscanf(token,"0x%X",&cur_pkey);
\r
195 if(! converted || (converted == EOF))
\r
197 printf("invalid registry format\n");
\r
201 for (i = 0; i < pkey_num; i++)
\r
203 found2remove = (boolean_t)(cur_pkey == pkeys[i]);
\r
215 cnt += sprintf(newKey + cnt,"0x%04X",cur_pkey);
\r
217 cnt += sprintf(newKey + cnt,",0x%04X",cur_pkey);
\r
219 token = strtok(NULL,seps);
\r
222 if(! pkey->pkey_num)
\r
224 /* nothing to delete */
\r
225 printf("No pkey found to remove\n");
\r
230 ret = RegSetValueEx(reg_handle,"PartitionKey",0,REG_SZ,(BYTE*)newKey, (DWORD)strlen(newKey));
\r
231 if (ERROR_SUCCESS != ret)
\r
233 printf("reg_ibbus_pkey_add RegSetValueEx error = %d\n",GetLastError());
\r
240 RegCloseKey( reg_handle );
\r
244 int send_create_pdo_req(pkey_array_t *pkeys)
\r
247 DWORD bytesReturned;
\r
252 GENERIC_READ | GENERIC_WRITE,
\r
253 FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode none
\r
254 NULL, // no security
\r
256 FILE_ATTRIBUTE_NORMAL,
\r
257 NULL // no template
\r
260 if (hKernelLib == INVALID_HANDLE_VALUE)
\r
262 printf("failed to open the kernel device : error = %d\n",GetLastError());
\r
266 if (! DeviceIoControl(hKernelLib,
\r
267 UAL_REQ_CREATE_PDO,
\r
268 pkeys,sizeof(pkey_array_t),
\r
273 printf("send_create_pdo_req failed error %d\n",GetLastError());
\r
274 CloseHandle(hKernelLib);
\r
277 CloseHandle(hKernelLib);
\r
281 boolean_t reg_pkey_operation(const REQUEST_IN *input)
\r
283 pkey_array_t pkeys;
\r
288 printf("create_ipoib_pdo : invalid input parameter\n");
\r
292 RtlZeroMemory(&pkeys,sizeof(pkeys));
\r
293 if(input->u.guid_pkey.action == pkey_add)
\r
294 result = reg_ibbus_pkey_add((unsigned __int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num, &pkeys);
\r
295 else if(input->u.guid_pkey.action == pkey_rem)
\r
297 result = reg_ibbus_pkey_rem((unsigned __int16*)input->u.guid_pkey.pkeys, input->u.guid_pkey.pkey_num, &pkeys);
\r
298 return (boolean_t)(result == 0);
\r
300 else if(input->u.guid_pkey.action == pkey_show)
\r
301 return reg_ibbus_print_pkey();
\r
306 return (boolean_t)( 0 == send_create_pdo_req(&pkeys));
\r
311 int prepare_reg_pkey_input(OUT REQUEST_IN *input,char* cmd[],int num)
\r
314 input->u.guid_pkey.pkey_num = 0;
\r
316 if(strstr(cmd[1],"add"))
\r
317 input->u.guid_pkey.action = pkey_add;
\r
318 else if(strstr(cmd[1],"rem"))
\r
319 input->u.guid_pkey.action = pkey_rem;
\r
320 else if(strstr(cmd[1],"show"))
\r
322 input->u.guid_pkey.action = pkey_show;
\r
327 printf("invalid command %s\n",cmd[1]);
\r
333 printf("invalid command %s\n",cmd[1]);
\r
336 for( i = 2; i < num; i++)
\r
338 if (strstr(cmd[i],"0x"))
\r
339 sscanf(cmd[i],"0x%x",&input->u.guid_pkey.pkeys[input->u.guid_pkey.pkey_num]);
\r
341 sscanf(cmd[i],"%x",&input->u.guid_pkey.pkeys[input->u.guid_pkey.pkey_num]);
\r
343 input->u.guid_pkey.pkey_num++;
\r
348 void partition_operation(char* cmd[],int num)
\r
352 if (! prepare_reg_pkey_input(&input, cmd, num))
\r
355 if(! reg_pkey_operation(&input))
\r
356 printf("Pkey operation failed\n");
\r
358 printf("Done...\n");
\r
366 BOOLEAN showHelp = FALSE;
\r
373 if(!_stricmp(argv[1], "-h") || !_stricmp(argv[1], "-help"))
\r
378 partition_operation(argv,argc);
\r